執行緒池及Spring Boot舉例

2021-09-25 08:47:52 字數 2706 閱讀 8666

執行緒池中定義的狀態

//執行狀態,指可以接受任務執行佇列裡的任務

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 這個方法只在外部呼叫才會開...