实现线程的顺序执行

之前,看到过一个题目,是关于如何使得线程顺序执行的

当时,我的第一个想法就是使用join方法,在t3线程内部调用t2线程的join()方法,然后在t2内部继续调用t1线程的join方法来实现线程的顺序执行,话不多说,手写代码来测试结果:

/*实现三个线程的顺序执行
 * coded by Jerome
 */
public class ThreadRun {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Thread t1 = new Thread(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				System.out.println(Thread.currentThread().getName()+"run 1");
			}
		},"T1");
		Thread t2 = new Thread(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				System.out.println(Thread.currentThread().getName()+"run 2");
				try{
					t1.join(10);
				}catch(InterruptedException e){
					e.printStackTrace();
				}
				
			}
		},"T2");
		Thread t3 = new Thread(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				System.out.println(Thread.currentThread().getName()+"run 3");
				try{
					t2.join(10);
				}catch(InterruptedException e){
					e.printStackTrace();
				}
			}
		},"T3");
		t1.start();
		t2.start();
		t3.start();

	}

}

根据代码分析,测试结果应该是t1先执行,然后是t2,最后是t3。但实验的结果是每次运行的结果都不一致,不知道问题出在哪,希望厉害的博友指教。

所以,就转变思路,考虑之前看过的线程池的知识,想到有一种线程池叫SingleThreadPool,该线程池是一个只有一个线程的线程池,任务都放到一个队列中,由于工作线程只有一个,所以只能一次取一个任务得来执行任务队列中的任务,所以能实现顺序执行。具体代码如下:

import java.lang.reflect.Executable;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/*实现线程的顺序执行
 * coded by Jerome
 */
public class ThreadRun_1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Thread t1 = new Thread(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				System.out.println(Thread.currentThread().getName()+" run 1");
			}
		},"T1");
		Thread t2 = new Thread(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				System.out.println(Thread.currentThread().getName()+" run 2");
				try {
					t1.join(10);
				} catch (InterruptedException e) {
					// TODO: handle exception
					e.printStackTrace();
				}
			}
		},"T2");
		Thread t3 = new Thread(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				System.out.println(Thread.currentThread().getName()+" run 3");
				try {
					t2.join(10);
				} catch (InterruptedException e) {
					// TODO: handle exception
					e.printStackTrace();
				}
			}
		},"T3");
		ExecutorService executor = Executors.newSingleThreadExecutor();
		executor.submit(t1);
		executor.submit(t2);
		executor.submit(t3);
		executor.shutdown();
	}

}

最终测试结果:


发现利用SingleThreadPool实现了线程顺序执行的功能。所以,还是需要能够把所学知识灵活运用的技巧和能力。希望大家多多关注博客,共同进步。

猜你喜欢

转载自blog.csdn.net/caisongcheng_good/article/details/80699804