• 多线程顺序执行方法概述


    (1)使用join()方法  

      在多个线程的执行过程中,若需要对于线程之间的执行顺序有要求的话,可以使用Thread类的join()方法,简单地对于join线程进行解释的话就是:


       调用线程要等待join线程执行完成之后才可以继续向下执行


      比如我们需要让主线程得到一个Thread1的输出值,这样子就得让Thread1执行完成之后,主线程的内容再继续执行:

    package thread.test;
    
    public class JoinFunctionTest {
    
    	public static void main(String[] args) throws InterruptedException {
    		// 测试join()
    		Thread thread1 = new Thread(new Runnable() {
    
    			@Override
    			public void run() {
    				// TODO Auto-generated method stub
    				System.out.println("Thread1执行");
    			}
    		});
                    thread1.start();
    		thread1.join();
    		System.out.println("等thread1执行完再执行主线程");
    	}
    }        
    

      

       

    package thread.test;
    
    public class JoinFunctionTest {
    
    	public static void main(String[] args) throws InterruptedException {
    		// 测试join()
    		final Thread thread1 = new Thread(new Runnable() {
    
    			@Override
    			public void run() {
    				// TODO Auto-generated method stub
    				System.out.println("Thread1执行");
    			}
    		});
    
    		final Thread thread2 = new Thread(new Runnable() {
    			@Override
    			public void run() {
    				try {
    					thread1.join();
    					System.out.println("Thread2执行");
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    			}
    		});
    
    		Thread thread3 = new Thread(new Runnable() {
    			@Override
    			public void run() {
    				try {
    					thread2.join();
    					System.out.println("Thread3执行");
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    			}
    		});
    
    		System.out.println("开始:");
    		System.out.println("Thread1上线...");
    		thread3.start();
    		System.out.println("Thread2上线...");
    		thread1.start();
    		System.out.println("Thread3上线...");
    		thread2.start();
    	}
    }
    

      

    (2)使用wait()方法和notify()方法

       

    package thread.test;
    
    /**
     *
     * wait():是Object的方法,作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。“直到其他线程调用此对象的
     * notify() 方法或 notifyAll() 方法”,当前线程被唤醒(进入“就绪状态”)
     * 
     * notify()和notifyAll():是Object的方法,作用则是唤醒当前对象上的等待线程;notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程。
     * 
     * wait(long timeout):让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的notify()方法或 notifyAll()
     * 方法,或者超过指定的时间量”,当前线程被唤醒(进入“就绪状态”)。
     * 
     * 应用场景:Java实现生产者消费者的方式。
     */
    public class WaitTest {
    
    	private static Object myLock1 = new Object();
    	private static Object myLock2 = new Object();
    
    	/**
    	 * 为什么要加这两个标识状态? 如果没有状态标识,当t1已经运行完了t2才运行,t2在等待t1唤醒导致t2永远处于等待状态
    	 */
    	private static Boolean t1Run = false;
    	private static Boolean t2Run = false;
    
    	public static void main(String[] args) {
    
    		final Thread thread1 = new Thread(new Runnable() {
    			@Override
    			public void run() {
    				synchronized (myLock1) {
    					System.out.println("Thread1开始执行...");
    					t1Run = true;
    					myLock1.notify();
    				}
    			}
    		});
    
    		final Thread thread2 = new Thread(new Runnable() {
    			@Override
    			public void run() {
    				synchronized (myLock1) {
    					try {
    						if (!t1Run) {
    							System.out.println("Thread2休息会...");
    							myLock1.wait();
    						}
    						synchronized (myLock2) {
    							System.out.println("Thread2开始执行..");
    							myLock2.notify();
    						}
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    				}
    			}
    		});
    
    		Thread thread3 = new Thread(new Runnable() {
    			@Override
    			public void run() {
    				synchronized (myLock2) {
    					try {
    						if (!t2Run) {
    							System.out.println("Thread3先休息会...");
    							myLock2.wait();
    						}
    						System.out.println("Thread3开始执行..");
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    				}
    			}
    		});
    
    		System.out.println("开始:");
    		System.out.println("Thread1来了...");
    		thread3.start();
    		System.out.println("Thread2来了...");
    		thread1.start();
    		System.out.println("Thread3来了...");
    		thread2.start();
    	}
    }

      

  • 相关阅读:
    给Windows组件添加图标
    C#文件和文件夹操作
    WinForm TreeView 右键菜单
    VC++ New 操作符
    Ext与Jquery的整合
    PowerDesign报表操作
    SQLServer自动建表存储过程
    Visual Studio 2008简体中文正式版下载地址
    WinForm遍历控件
    发布时用直接用源文件部署
  • 原文地址:https://www.cnblogs.com/dashenaichicha/p/12596024.html
Copyright © 2020-2023  润新知