乙個簡單的定時任務小例子

2022-03-26 13:55:32 字數 3465 閱讀 2579

【強制】執行緒資源必須通過執行緒池提供,不允許在應用中自行顯式建立執行緒。

說明:使用執行緒池的好處是減少在建立和銷毀執行緒上所花的時間以及系統資源的開銷,解決資

源不足的問題。如果不使用執行緒池,有可能造成系統建立大量同類執行緒而導致消耗完記憶體或者

「過度切換」的問題。

【強制】執行緒池不允許使用 executors 去建立,而是通過 threadpoolexecutor 的方式,這樣

的處理方式讓寫的同學更加明確執行緒池的執行規則,規避資源耗盡的風險。

說明: executors 返回的執行緒池物件的弊端如下:

1) fixedthreadpool 和 singlethreadpool :

允許的請求佇列長度為 integer.max_value ,可能會堆積大量的請求,從而導致 oom 。

2) cachedthreadpool 和 scheduledthreadpool :

允許的建立執行緒數量為 integer.max_value ,可能會建立大量的執行緒,從而導致 oom 。

以上是來自靈狐外掛程式的提示

newscheduledthreadpool、newcachedthreadpool 的 

maximumpoolsize 都是 integer.max_value,

如果有一些執行緒異常等待,可能會導致建立大量執行緒

而 newsinglethreadexecutor 和 newfixedthreadpool 都是lindedblockingqueue,其長度無限制,可能會導致等待佇列無限長

所以我們使用

corepoolsize:執行緒池啟動後,在池中保持的執行緒的最小數量。需要說明的是執行緒數量是逐步到達corepoolsize值的。例如corepoolsize被設定為10,而任務數量只有5,則執行緒池中最多會啟動5個執行緒,而不是一次性地啟動10個執行緒。

maxinumpoolsize:

執行緒池中能容納的最大執行緒數量,如果超出,則使用rejectedexecutionhandler拒絕策略處理。

keepalivetime

執行緒的最大生命週期。這裡的生命週期有兩個約束條件:一:該引數針對的是超過corepoolsize數量的執行緒;二:處於非執行狀態的執行緒。舉個例子:如果corepoolsize(最小執行緒數)為10,maxinumpoolsize(最大執行緒數)為20,而此時執行緒池中有15個執行緒在執行,過了一段時間後,其中有3個執行緒處於等待狀態的時間超過keepalivetime指定的時間,則結束這3個執行緒,此時執行緒池中則還有12個執行緒正在執行。

unit:

這是keepalivetime的時間單位,可以是納秒,毫秒,秒,分鐘等。

workqueue:

任務佇列。當執行緒池中的執行緒都處於執行狀態,而此時任務數量繼續增加,則需要乙個容器來容納這些任務,這就是任務佇列。這個任務佇列是乙個阻塞式的單端佇列。

threadfactory:

定義如何啟動乙個執行緒,可以設定執行緒的名稱,並且可以確定是否是後台執行緒等。

handler

拒絕任務處理器。由於超出執行緒數量和佇列容量而對繼續增加的任務進行處理的程式。

ok,threadpoolexecutor中的主要引數介紹完了。我們再說一下執行緒的管理過程:首先建立乙個執行緒池,然後根據任務的數量逐步將執行緒增大到corepoolsize,如果此時仍有任務增加,則放置到workqueue中,直到workqueue爆滿為止,然後繼續增加池中的執行緒數量(增強處理能力),最終達到maxinumpoolsize。那如果此時還有任務要增加進來呢?這就需要handler來處理了,或者丟棄新任務,或者拒絕新任務,或者擠占已有的任務。在任務佇列和執行緒池都飽和的情況下,一旦有執行緒處於等待(任務處理完畢,沒有新任務)狀態的時間超過keepalivetime,則該執行緒終止,也就是說池中的執行緒數量會逐漸降低,直至為corepoolsize數量為止。

public

static

executorservice getexecutorservice() }}

return

executorservice;

}

坑1:

如果corepoolsize 設定為0,和 corepoolsize 為1效果是一樣的,無論maxinumpoolsize 是多少,這時候都是單執行緒在執行,適用於 單執行緒-非同步執行的場景

坑2:如果使用 new synchronousqueue(),該佇列不能自定義長度,maxinumpoolsize 的值設定一定要合理,比如 需要100個執行緒,maxinumpoolsize 設定為50,這時候 會丟擲乙個rejectedexecutionexception異常,並且直接丟棄掉50個任務;使用  linkedblockingdeque,如果其長度 + maxinumpoolsize  小於  所需要的執行緒數,也是會丟擲rejectedexecutionexception。

關於 maxinumpoolsize  corepoolsize  和 佇列長度:

從執行緒池中獲取可用執行緒執行任務,如果沒有可用執行緒則使用threadfactory建立新的執行緒,直到執行緒數達到corepoolsize限制

執行緒池執行緒數達到corepoolsize以後,新的任務將被放入佇列,直到佇列不能再容納更多的任務

當佇列不能再容納更多的任務以後,會建立新的執行緒,直到執行緒數達到maxinumpoolsize限制

執行緒數達到maxinumpoolsize限制以後新任務會被拒絕執行,呼叫 rejectedexecutionhandler 進行處理

mysql定時任務簡單例子

如果要每30秒執行以下語句 update userinfo set endtime now where id 110 可以給mysql建個定時任務,具體方法如下 delimiter 設定語句終結符為 因儲存過程語句用 結束 一 檢視event是否開啟 show variables like sche...

Spring Quartz簡單例子,定時任務

spring對quartz的整合也從側面反映出quartz功能的強大。以下這個例子的作業類繼承org.springframework.scheduling.quartz.quartzjobbean類 也有不繼承該類的方式 job作業類testquartzjob package com import ...

mysql定時任務簡單例子

如果要每5秒執行以下語句 update tt set tt.update time now where id 1 insert into tt tno,tname values 53,66 可以給mysql建個定時任務,具體方法如下 delimiter 設定語句終結符為 因儲存過程語句用 結束 一 ...