代碼驗證執行緒池的入隊程序以及shutdown之后會不會處理之前提交過的任務
創建一個核心執行緒數為3,最大執行緒數為6,阻塞佇列為10的執行緒池
前三個任務丟進去,讓他睡1s才開始執行,之后的任務正常執行,當第十五個任務進去執行后,呼叫shutdown關閉執行緒池,
public class MyThreadFactory implements ThreadFactory {
private final String namePrefix;
private final AtomicInteger nextId=new AtomicInteger(1);
public MyThreadFactory(String featureOfGroup) {
this.namePrefix = featureOfGroup+",執行緒編號-";
}
@Override
public Thread newThread(Runnable r) {
String name=namePrefix+nextId.getAndIncrement();
Thread thread=new Thread(null,r,name,0);
return thread;
}
}
public class Test {
public static void main(String[] args) {
ThreadFactory threadFactory=new MyThreadFactory("測驗");
ThreadPoolExecutor executor=new ThreadPoolExecutor(3,6,20,
TimeUnit.SECONDS,new LinkedBlockingDeque<Runnable>(10),
threadFactory,new ThreadPoolExecutor.AbortPolicy());
for(int i=1; i<=20; i++){
if(i<=3){
executor.submit(
new Runnable() {
@Override
public void run() {
try{
Thread.sleep(1000);
}catch (Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"完成了任務");
}
}
);
}else {
executor.submit(
new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"完成了任務");
}
}
);
if(i==15){ executor.shutdown(); }
}
System.out.println("任務數量"+executor.getTaskCount());
System.out.println("大約正在執行任務的執行緒數:"+executor.getActiveCount());
System.out.println("佇列:"+ executor.getQueue().toString());
System.out.println("完成任務的數目:"+executor.getCompletedTaskCount());
System.out.println("----------------------------");
}
}
}
運行結果:從第4個任務開始入隊,直到佇列滿了之后,又開始創建非核心執行緒去執行任務(看第14個任務,就會發現執行緒數變多了,說明增加了一個非核心執行緒,此時的佇列還是滿的)直到第15個任務,也創建了新執行緒去執行,此時的執行緒數為5個了,多了兩個非核心執行緒,
我們再來看看,前面15個任務有沒有被執行完成呢,去數一下就會發現,都被執行完成了,
任務數量1
大約正在執行任務的執行緒數:1
佇列:[]
完成任務的數目:0
----------------------------
任務數量2
大約正在執行任務的執行緒數:2
佇列:[]
完成任務的數目:0
----------------------------
任務數量3
大約正在執行任務的執行緒數:3
佇列:[]
完成任務的數目:0
----------------------------
任務數量4
大約正在執行任務的執行緒數:3
佇列:[java.util.concurrent.FutureTask@12a3a380]
完成任務的數目:0
----------------------------
任務數量5
大約正在執行任務的執行緒數:3
佇列:[java.util.concurrent.FutureTask@12a3a380, java.util.concurrent.FutureTask@29453f44]
完成任務的數目:0
----------------------------
任務數量6
大約正在執行任務的執行緒數:3
佇列:[java.util.concurrent.FutureTask@12a3a380, java.util.concurrent.FutureTask@29453f44, java.util.concurrent.FutureTask@5cad8086]
完成任務的數目:0
----------------------------
任務數量7
大約正在執行任務的執行緒數:3
佇列:[java.util.concurrent.FutureTask@12a3a380, java.util.concurrent.FutureTask@29453f44, java.util.concurrent.FutureTask@5cad8086, java.util.concurrent.FutureTask@6e0be858]
完成任務的數目:0
----------------------------
任務數量8
大約正在執行任務的執行緒數:3
佇列:[java.util.concurrent.FutureTask@12a3a380, java.util.concurrent.FutureTask@29453f44, java.util.concurrent.FutureTask@5cad8086, java.util.concurrent.FutureTask@6e0be858, java.util.concurrent.FutureTask@61bbe9ba]
完成任務的數目:0
----------------------------
任務數量9
大約正在執行任務的執行緒數:3
佇列:[java.util.concurrent.FutureTask@12a3a380, java.util.concurrent.FutureTask@29453f44, java.util.concurrent.FutureTask@5cad8086, java.util.concurrent.FutureTask@6e0be858, java.util.concurrent.FutureTask@61bbe9ba, java.util.concurrent.FutureTask@610455d6]
完成任務的數目:0
----------------------------
任務數量10
大約正在執行任務的執行緒數:3
佇列:[java.util.concurrent.FutureTask@12a3a380, java.util.concurrent.FutureTask@29453f44, java.util.concurrent.FutureTask@5cad8086, java.util.concurrent.FutureTask@6e0be858, java.util.concurrent.FutureTask@61bbe9ba, java.util.concurrent.FutureTask@610455d6, java.util.concurrent.FutureTask@511d50c0]
完成任務的數目:0
----------------------------
任務數量11
大約正在執行任務的執行緒數:3
佇列:[java.util.concurrent.FutureTask@12a3a380, java.util.concurrent.FutureTask@29453f44, java.util.concurrent.FutureTask@5cad8086, java.util.concurrent.FutureTask@6e0be858, java.util.concurrent.FutureTask@61bbe9ba, java.util.concurrent.FutureTask@610455d6, java.util.concurrent.FutureTask@511d50c0, java.util.concurrent.FutureTask@60e53b93]
完成任務的數目:0
----------------------------
任務數量12
大約正在執行任務的執行緒數:3
佇列:[java.util.concurrent.FutureTask@12a3a380, java.util.concurrent.FutureTask@29453f44, java.util.concurrent.FutureTask@5cad8086, java.util.concurrent.FutureTask@6e0be858, java.util.concurrent.FutureTask@61bbe9ba, java.util.concurrent.FutureTask@610455d6, java.util.concurrent.FutureTask@511d50c0, java.util.concurrent.FutureTask@60e53b93, java.util.concurrent.FutureTask@5e2de80c]
完成任務的數目:0
----------------------------
任務數量13
大約正在執行任務的執行緒數:3
佇列:[java.util.concurrent.FutureTask@12a3a380, java.util.concurrent.FutureTask@29453f44, java.util.concurrent.FutureTask@5cad8086, java.util.concurrent.FutureTask@6e0be858, java.util.concurrent.FutureTask@61bbe9ba, java.util.concurrent.FutureTask@610455d6, java.util.concurrent.FutureTask@511d50c0, java.util.concurrent.FutureTask@60e53b93, java.util.concurrent.FutureTask@5e2de80c, java.util.concurrent.FutureTask@1d44bcfa]
完成任務的數目:0
----------------------------
任務數量14
大約正在執行任務的執行緒數:4
佇列:[java.util.concurrent.FutureTask@12a3a380, java.util.concurrent.FutureTask@29453f44, java.util.concurrent.FutureTask@5cad8086, java.util.concurrent.FutureTask@6e0be858, java.util.concurrent.FutureTask@61bbe9ba, java.util.concurrent.FutureTask@610455d6, java.util.concurrent.FutureTask@511d50c0, java.util.concurrent.FutureTask@60e53b93, java.util.concurrent.FutureTask@5e2de80c, java.util.concurrent.FutureTask@1d44bcfa]
完成任務的數目:0
----------------------------
任務數量15
大約正在執行任務的執行緒數:5
佇列:[java.util.concurrent.FutureTask@12a3a380, java.util.concurrent.FutureTask@29453f44, java.util.concurrent.FutureTask@5cad8086, java.util.concurrent.FutureTask@6e0be858, java.util.concurrent.FutureTask@61bbe9ba, java.util.concurrent.FutureTask@610455d6, java.util.concurrent.FutureTask@511d50c0, java.util.concurrent.FutureTask@60e53b93, java.util.concurrent.FutureTask@5e2de80c, java.util.concurrent.FutureTask@1d44bcfa]
完成任務的數目:0
----------------------------
測驗,執行緒編號-4完成了任務
測驗,執行緒編號-5完成了任務
測驗,執行緒編號-5完成了任務
測驗,執行緒編號-5完成了任務
測驗,執行緒編號-5完成了任務
測驗,執行緒編號-4完成了任務
測驗,執行緒編號-5完成了任務
測驗,執行緒編號-4完成了任務
測驗,執行緒編號-5完成了任務
測驗,執行緒編號-4完成了任務
測驗,執行緒編號-5完成了任務
測驗,執行緒編號-4完成了任務
Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@5e481248 rejected from java.util.concurrent.ThreadPoolExecutor@66d3c617[Shutting down, pool size = 5, active threads = 5, queued tasks = 10, completed tasks = 0]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2047)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:823)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1369)
at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)
at Test.main(Test.java:26)
測驗,執行緒編號-2完成了任務
測驗,執行緒編號-1完成了任務
測驗,執行緒編號-3完成了任務
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/173245.html
標籤:其他
