zoukankan      html  css  js  c++  java
  • 通过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(),一次类推、 

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

               我喜欢这样的代码

  • 相关阅读:
    SQL Server 数据库部分常用语句小结(三)
    SQL Server 数据库部分常用语句小结(四)
    通过存储过程(SP)实现SQL Server链接服务器(LinkServer)的添加
    pcb布线强弱电间隔距离
    程序占用内存大小
    Offer来了(原理篇)笔记之第三章并发编程
    Offer来了(原理篇)笔记之第一章JVM原理
    西瓜视频奇妙的bug
    mongodb忘记了admin的账号密码
    MongoDB更改默认端口
  • 原文地址:https://www.cnblogs.com/toov5/p/10146619.html
Copyright © 2011-2022 走看看