多线程顺序执行方法概述

(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();
	}
}

  

原文地址:https://www.cnblogs.com/dashenaichicha/p/12596024.html