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