執行緒池中定義的狀態
//執行狀態,指可以接受任務執行佇列裡的任務
private static final int running = -1 << count_bits;
//指呼叫了 shutdown() 方法,不再接受新任務了,但是佇列裡的任務得執行完畢
private static final int shutdown = 0 << count_bits;
// 指呼叫了 shutdownnow() 方法,不再接受新任務,同時拋棄阻塞佇列裡的所有任務並中斷所有正在執行任務
private static final int stop = 1 << count_bits;
//所有任務都執行完畢,在呼叫 shutdown()/shutdownnow() 中都會嘗試更新為這個狀態
private static final int tidying = 2 << count_bits;
//終止狀態,當執行 terminated() 後會更新為這個狀態
private static final int terminated = 3 << count_bits;
執行緒池的execute方法
public void execute(runnable command)
//如果當前執行緒處於執行狀態,並且寫入阻塞佇列成功
if (isrunning(c) && workqueue.offer(command))
else if (!addworker(command, false))//如果判斷為非執行狀態,嘗試新建執行緒,如果失敗則執行拒絕策略
reject(command);
}
拒絕策略
配置執行緒
spring boot實現:
@slf4j
@component
public class threadpoolmanager
return threadpool;
}public static void initthreadpool() ],threadnum [{}]", cpunum,threadnum);
threadpool = new threadpool(threadnum, threadnum, 0l);}}
}}
/*** postconstruct修飾的方法會在伺服器載入servle的時候執行,並且只會被伺服器執行一次。postconstruct在建構函式之後執行,init()方法之前執行。方法在destroy()方法執行執行之後執行
*/@predestroy
public void destroythreadpool()
}@getter
public static class threadpool
/*** 提交乙個任務到執行緒池中
** @param runnable
*/public void execute(runnable runnable)
threadpoolexecutor.execute(runnable);
}/**
* 提交乙個任務到執行緒池中,並返回執行結果
** @param futuretask
*/public void submit(futuretaskfuturetask)
threadpoolexecutor.submit(futuretask);
}/**
* 從執行緒佇列中移除物件
** @param runnable
*/public void cancel(runnable runnable)
threadpoolexecutor.shutdown();
}public void cancel(callabletask)
}/**
* 不再接受新任務了,但是佇列裡的任務得執行完畢
*/public void shutdown() }}
}
執行任務執行緒
@slf4j
public class consumerqueuethread implements runnable ] time [{}]",i++,system.currenttimemillis());
log.info("queue size [{}]",threadpoolmanager.getthreadpool().getthreadpoolexecutor().getqueue().size());
}}
service呼叫
@slf4j
@service("threadpoolservice")
public class threadpoolserviceimpl implements threadpoolservice {
@override
public boolean testexcutethread(int threadnumber) {
log.info("start testexcutethread");
for (int i = 0;i
坑:如果不是自定義執行緒池,需注意的是原生執行緒池中執行任務丟擲的異常會在afterexecute進行空處理,所以我們需在runable將異常catch住,或者自定義執行緒池重寫afterexecute方法
springBoot執行緒池
1 定義執行緒池 enableasync configuration classtaskpoolconfig 上面我們通過使用threadpooltaskexecutor建立了乙個執行緒池,同時設定了以下這些引數 說明 setwaitfortaskstocompleteonshutdown true...
Springboot 執行緒池
配置類 configuration enableasync public class taskpoolconfig 執行執行緒中,如果有區域性變數要使用 或者有外部值傳入 新建thead 實現callable介面 可以直接使用函式中的值的話使用lambda表示式,使用completionservic...
springboot 執行緒池
1 在啟動類上加標記 enableasync slf4j exclude enableasync public class extends springbootservletinitializer 3 使用,方法名上加 async asyncserviceexecutor 這個方法只在外部呼叫才會開...