我们有时貌似熟悉异步、多线程、任务和并行,但有时又不一定特别清楚它们之前的本质区别,甚至在很多复杂的场景下乱用一气。下面我就结合场景来说明在什么情况下该采用什么。同时,还讲解下如何优雅地控制线程,处理任务和并行中的异常。
一、在什么场景可以使用多线程
- 想要同时处理多件事:单线程处理不了的,必须使用多线程。(类似于分身术)
- 多个线程分解大任务:用单线程可以做,但是使用多线程可以更快。(类似于左右开弓)
例1:同时处理2件事
场景描述: 执行实际工作20秒钟,20秒时间到结束执行。
public class CalculatePrimes extends Thread{
//使用两个线程,一个用于计时(线程会休眠20秒然后设置一个主线程要检查的标志finished),一个用于执行实际工作。在执行实际工作的线程启动前启动计时线程。
//达到20秒钟主线程将停止。
public static final int SECONDS = 20000;
public volatile boolean finished = false;
public void run(){
System.out.println("开始执行实际工作啦");
for (long i = 0l; i < Long.MAX_VALUE; i++) {
if(finished){
break;
}
if(i%100000000==0){
System.out.println("i:"+i);
}
}
System.out.println("结束执行实际工作啦");
}
public static void main(String[] args){
//通过实例化CalculatePrimes类型的对象来创建线程。
CalculatePrimes calculator = new CalculatePrimes();
calculator.start();
try{
System.out.println("执行Thread.sleep前,时间为:"+System.currentTimeMillis());
Thread.sleep(SECONDS);
System.out.println("执行Thread.s