线程池shutdown之后的代码,执行顺序
线程池起多个线程,执行顺序
public class ThreadPoolRun implements Runnable {
String name;
public ThreadPoolRun(String name) {
this.name = name;
}
@Override
public void run() {
for (int i=0;i<100;i++){
System.out.println(name+":"+i);
}
}
}
public class ThreadPool {
public static void main(String[] args) {
new ThreadPool().doTest();
}
public int doTest(){
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 3, 1, TimeUnit.MINUTES, new ArrayBlockingQueue(1));
ThreadPoolRun threadPoolRunA = new ThreadPoolRun("A");
ThreadPoolRun threadPoolRunB = new ThreadPoolRun("B");
ThreadPoolRun threadPoolRunC = new ThreadPoolRun("C");
threadPoolExecutor.execute(threadPoolRunA);
threadPoolExecutor.execute(threadPoolRunB);
threadPoolExecutor.execute(threadPoolRunC);
threadPoolExecutor.shutdown();
try {
threadPoolExecutor.awaitTermination(60, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 0;
}
}
ABC三个线程谁分到cpu谁执行,并发
在shutdown之前的业务代码
public int doTest(){
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 3, 1, TimeUnit.MINUTES, new ArrayBlockingQueue(1));
ThreadPoolRun threadPoolRunA = new ThreadPoolRun("A");
ThreadPoolRun threadPoolRunB = new ThreadPoolRun("B");
ThreadPoolRun threadPoolRunC = new ThreadPoolRun("C");
threadPoolExecutor.execute(threadPoolRunA);
threadPoolExecutor.execute(threadPoolRunB);
threadPoolExecutor.execute(threadPoolRunC);
for (int a = 0;a<100;a++){
System.out.println(Thread.currentThread().getName()+":"+a);
}
threadPoolExecutor.shutdown();
try {
threadPoolExecutor.awaitTermination(60, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 0;
}
主线程和三条线程共同竞争cpu,并发
shutdown之后的业务代码
public int doTest(){
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 3, 1, TimeUnit.MINUTES, new ArrayBlockingQueue(1));
ThreadPoolRun threadPoolRunA = new ThreadPoolRun("A");
ThreadPoolRun threadPoolRunB = new ThreadPoolRun("B");
ThreadPoolRun threadPoolRunC = new ThreadPoolRun("C");
threadPoolExecutor.execute(threadPoolRunA);
threadPoolExecutor.execute(threadPoolRunB);
threadPoolExecutor.execute(threadPoolRunC);
for (int a = 0;a<100;a++){
System.out.println(Thread.currentThread().getName()+":"+a);
}
threadPoolExecutor.shutdown();
for (int a = 100;a<200;a++){
System.out.println(Thread.currentThread().getName()+":"+a);
}
try {
threadPoolExecutor.awaitTermination(60, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 0;
}
主线程内保持顺序(0-99先打印,100-199后打印),但四个线程仍竞争cpu,执行顺序不确定
在return语句中的线程和方法体中线程的执行顺序
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ThreadPool {
public static void main(String[] args) {
new ThreadPool().doTest();
}
public int doTest(){
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 3, 1, TimeUnit.MINUTES, new ArrayBlockingQueue(1));
ThreadPoolRun threadPoolRunA = new ThreadPoolRun("A");
ThreadPoolRun threadPoolRunB = new ThreadPoolRun("B");
ThreadPoolRun threadPoolRunC = new ThreadPoolRun("C");
threadPoolExecutor.execute(threadPoolRunA);
threadPoolExecutor.execute(threadPoolRunB);
threadPoolExecutor.execute(threadPoolRunC);
for (int a = 0;a<100;a++){
System.out.println(Thread.currentThread().getName()+":"+a);
}
threadPoolExecutor.shutdown();
for (int a = 100;a<200;a++){
System.out.println(Thread.currentThread().getName()+":"+a);
}
try {
threadPoolExecutor.awaitTermination(60, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
return doLast();
}
public int doLast(){
new Thread(()->{
for (int a = 200;a<300;a++){
System.out.println(Thread.currentThread().getName()+":"+a);
}
}).start();
return 0;
}
}
return语句中的代码总是在最后执行。
总结
线程池中的线程和主线程共同竞争cpu,并发运行。线程池当中的线程都结束时,线程池关闭。上述过程不存在先后顺序,有可能主线程跑完,ABC还没结束,线程池还未关闭。
但是,方法return语句必定在所有线程结束后才会执行。
个人理解是,return是方法最后返回时执行,必须等到方法体的业务执行完毕才会走到,不管方法体中有多少线程,都需要执行完毕。
当方法return时,从栈弹出,不应该存在还未执行完的线程。