一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

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

时间:2015-08-13 编辑:简简单单 来源:一聚教程网

问题:子线程循环 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);
        }
    }
}


热门栏目