java编程中主线程子线程交替问题分析

问题:子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次。

分析:这个实际上是很简单的问题,即子线程run,主线程阻塞--->子线程阻塞,主线程run,能够使线程阻塞的方法有很多,最常见的是sleep与wait;当然,需要控制的话,用wait/notify。子线程与主线程共同操作一个Resource 对象,而Resource对象中由两个方法分别实现子线程与主线程的操作对象

代码如下:

package treadgame;
/**
 * 线程间的交流1
 * 子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,
 * 接着再回到主线程又循环 100 次,如此循环50次
 * @author lcx
 *
 */
public class ThreadExchange1 {
    public static void main(String[] args) 
    {
        Resource res=new Resource();
        new Thread(new Sub(res)).start();
        for(int i=1;i<=50;i++)
        {
            res.runMain();
        }
    }
}
class Resource 
{
    boolean isSub=true;
    
    public synchronized void runMain()
    {
        if(isSub)
        {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        for(int i=1;i<=100;i++)
        System.out.println("主线程循环次数   "+i);
        isSub=!isSub;
        notify();
    }
    
    public synchronized void runSub()
    {
        if(!isSub)
        {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        for(int i=1;i<=10;i++)
        System.out.println("子线程循环次数   "+i);
        isSub=!isSub;
        notify();
    }
    
}
class Sub implements Runnable
{
    Resource res;
    public Sub(Resource res)
    {
        this.res=res;
    }
    public void run()
    {
        for(int i=1;i<=50;i++)
        {
            res.runSub();
        }
    }
}

创建2个线程,和主线程交替运行.

原理:  
将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。
为什么要将Runnable接口的子类对象传递给Thread的构造函数。
因为,自定义的run方法所属的对象是Runnable接口的子类对象。
所以要让线程去指定指定对象的run方法。就必须明确该run方法所属对象。

调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。

/*
创建2个线程,和主线程交替运行.
 */
class E implements Runnable{
    public void run(){
        for(int x=0;x<10;x++){
            System.out.println(Thread.currentThread().getName()+"我是:"+x);
        }
    }
}
public class Threade_15 {
    public static void main(String[] args) {
        E ee=new E();
        Thread t1=new Thread(ee);
        Thread t2=new Thread(ee);
        t1.start();
        t2.start();
        
        for(int x=0;x<10;x++){
            System.out.println(Thread.currentThread().getName()+"我是:"+x);
        }
    }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索编程
, 对象
, 线程
, new
, thread
代码
java两个线程交替执行、java两个线程交替打印、java线程交替执行、java 多线程 交替打印、java 线程交替,以便于您获取更多的相关知识。

时间: 2025-01-28 04:44:30

java编程中主线程子线程交替问题分析的相关文章

关于主线程子线程运行顺序的疑惑

问题描述 关于主线程子线程运行顺序的疑惑 这里是书上截得一段程序,我不明白!这是运行结果:为什么运行结果一开始是waiting for thread to finish也就是主线程先跑的.为什么一开始不是子线程先跑?求大神解答 解决方案 因为pthread_join的存在,join使得主线程和子线程同步,主线程阻塞住等待子线程运行完. 不同语言略有差异,但是基本上都是类似的,找一篇文章你看下http://blog.csdn.net/hmk2011/article/details/6289151

Android ThreadUtil 线程公共类,判断是否在主线程/ 子线程执行 相关操作

前言:通常,我们写的公共的模块给别人用,但是这个模块又必须在特定的线程中执行.         比如,一个加载网络图片的的方法,需要在子线程中执行. /** * 加载网络图片 */ private void loadImage() { try { //用延时3秒操作来模拟网络操作 Thread.sleep( 3000 ); } catch (InterruptedException e) { e.printStackTrace(); } } 但是其他的同事在使用的时候,可能一不小心就在主线程中执

Android中主线程与子线程之间相互通信教程

有时候,我们也可能碰到这样子的一种需求:需要主线程来向子线程发送消息,希望子线程来完成什么任务.如果这样子应该怎么做呢?这就是这篇文章将要讨论的内容. 一.HandlerThread类 主线程发送消息给子线程,通常思维逻辑就是:其实很简单,在主线程中实例化一个Handler,然后让他与子线程相关联(只要它与子线程的Looper相关联即可),这样子它处理的消息就是该子线程中的消息队列,而处理的逻辑都是在该子线程中执行的,不会占用主线程的时间.那么我们就来实现一下,看看这样子到底行得通还是行不通.新

在C#中主线程和子线程如何实现互相传递数据

在C#中主线程和子线程如何实现互相传递数据                                         老帅    在C#中创建线程Thread时,可以有多种方法,而主线程和子线程之间又如何实现互相传递数据,每种创建方法传递参数的效果是不同的,逐一看一下:  一.不带参数创建Thread  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 using System;  using System.Collec

c++中如何将子线程的参数传回主线程

问题描述 c++中如何将子线程的参数传回主线程 1C DWORD WINAPI threadFunction(LPVOID pArg) //返回值进程id(dword类型) 参数类型 LPVOID{ tNum myNum = *((tNum *)pArg); //将参数转化成int型 EnterCriticalSection(&gCS); // 进入临界区 myNum.string_back = FuzzyHash(myNum.string_in); LeaveCriticalSection(&a

仔细触摸Java编程中的“文档”和“包”

编程 什么是包 Java中的包(Package)其实指的就是目录,它是为了更好地管理Java类(Class)和接口(Interface).Java语言的包可以被另一个Java开发包所使用.如果我们要引用某个包中的类,用import关键字来标明即可.比如: import java.util. date=new Date  提示:import java.util.表示java.util中的所有公有类和接口被引入到当前包.这里的匹配符可以调入多个类名. 常用的Java标准包 JDK为我

java代码-关于CSDN英雄会挑战赛 java编程中的一些问题

问题描述 关于CSDN英雄会挑战赛 java编程中的一些问题 各位大神,我在挑战英雄会的题目的时候,在线下运行的没有问题,可是一提交就会提示,"挑战失败:你的程序正常编译,不过运行时发生错误,通常是代码有问题,如除数为零数组上下界溢出等" 我觉得可能是java输入数据时的问题,因为题目要求:输入多行数据,输出多行我是这样写的: Scanner scanner = new Scanner(System.in); ArrayList list = new ArrayList(); do {

跨越边界: 活动记录和Java编程中特定于域的语言

DSL 是专门解决特定于域问题的语言.通过更接近问题的操作,DSL 可以提供在通用语言中可能找不 到的好处.Java 世界中充满了 DSL.属性文件.Spring 上下文.标注的某种用法以及 Ant 任务,都是 DSL 的示例. 在开始研究其他像 Ruby 这样的语言的时候,我开始理解到 Java 语言目前对于 DSL 还没有良好的把 握.在这篇文章中,将看到 Ruby 使用的四种集成干净的 DSL 的技巧.然后,将看到在 Java 语言中可 能存在的选项是什么. 隐藏语言的世界 虽然您可能不知

Java编程中异常处理的优劣之道

Java编程中的异常处理是一个很常见的话题了,几乎任何一门介绍性的Java课程都会提到异常处理.不过,我认为很多人其实并没有真正掌握正确处理异常情况的方法和策略,最多也就不过了解个大概,知道点概念.本文就对三种不同程度和质量的Java异常处理进行了讨论,所阐述的处理异常的方式按手法的高下分为: 好,不好和恶劣三种. 同时向你提供了一些解决这些问题的技巧. 首先解释一些java异常处理中必须搞清楚的定义和机制.Java语言规范将自Error类或RuntimeException类衍生出来的任何违例都