• 通过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(),一次类推、 

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

               我喜欢这样的代码

  • 相关阅读:
    winform,WPF 释放内存垃圾,减少资源占用方法
    Winform中使用WPF控件并动态读取Xaml
    Winform程序双向绑定
    STM32L15XXX 入门笔记
    STM32固件库下载地址
    C#实现虚拟控件列表显示100w个控件方法
    DotNetBar滚动条的疑似BUG
    VS Sln图标空白修复办法
    Swift下使用Xib设计界面
    关于Mac OS虚拟机下共享文件夹的方法
  • 原文地址:https://www.cnblogs.com/toov5/p/10146619.html
Copyright © 2020-2023  润新知