通过join方法顺序执行多个线程

方法一:直接用多线程之间的通讯去解决

package com.toov5.test;

import javax.imageio.ImageTypeSpecifier;

class Res1{
    char flag = 'A' ;
}


class A extends Thread{
    
    Res1 res;
    public A(Res1 res) {
        this.res=res;
    }    
    @Override
    public void run() {
        
        while (true) {
            synchronized (res) {
                if (res.flag == 'A') {
                    System.out.println("A");
                    res.flag='B';
                    res.notifyAll();
                }else {
                    try {
                        res.wait();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    
                }
            }
        }
        
    }
    
}



class B extends Thread{
    Res1 res;
    public B(Res1 res) {
        this.res=res;
    }    
    
    @Override
    public void run() {
        while (true) {
            synchronized (res) {
                if (res.flag == 'B') {
                    System.out.println("B");
                    res.flag='C';
                    res.notifyAll();
                }else {            
                    try {
                        res.wait();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
}



class C extends Thread{
    Res1 res;
    public C(Res1 res) {
        this.res=res;
    }    
    
  
    @Override
    public void run() {
        while (true) {
            synchronized (res) {
                if (res.flag == 'C') {
                    System.out.println("C");
                    res.flag='D';
                }else {
                    try {
                        res.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
}

public class Test9 {
    
     public static void main(String[] args) {
           Res1 res1 = new Res1();
           A a = new A(res1);
           B b = new B(res1);
           C c = new C(res1);
           a.start();
           b.start();
           c.start();
           
    }
    
    
    

}

方法二:join()去执行

 

public class JoinThreadDemo02 {
    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {
            public void run() {
                System.out.println("A");
            }
        });
        Thread t2 = new Thread(new Runnable() {
            public void run() {
                try {
                    t1.join();
                } catch (Exception e) {
                    // TODO: handle exception
                }
                System.out.println("B");
            }
        });
        Thread t3 = new Thread(new Runnable() {
            public void run() {
                try {
                    t2.join();
                } catch (Exception e) {
                    // TODO: handle exception
                }
                System.out.println("C");
            }
        });
        t1.start();
        t2.start();
        t3.start();
    }
}

 

  解读:三个线程在交替执行,被cpu去调度。 如果调度的是t3 那么执行的是 t2.join()  此时t2线程又是跑了 t1.join(),一次类推、 

            总之 三个线程去调度时候 都是不确定的 每次的调度都是套着环在里面  每种可能性都有了设计

           我喜欢这样的代码

 

posted @ 2018-12-19 22:33  toov5  阅读(815)  评论(0编辑  收藏  举报