之前,看到过一个题目,是关于如何使得线程顺序执行的
当时,我的第一个想法就是使用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实现了线程顺序执行的功能。所以,还是需要能够把所学知识灵活运用的技巧和能力。希望大家多多关注博客,共同进步。