多執行緒學習----執行緒池(九)
阿新 • • 發佈:2018-11-03
1.固定執行緒池
建立一個執行緒池,裡邊放三個執行緒,建立十個任務,讓三個執行緒誰有空閒誰去執行這十個任務,直到任務結束。
public class ThreadPoolStudy { public static void main(String[] args) { //建立一個裝有三個執行緒的執行緒池 ExecutorService threadPool = Executors.newFixedThreadPool(3); for(int i = 1;i < 11;i++){ final int task = i; threadPool.execute(new Runnable() { @Override public void run() { for(int j = 1;j < 6;j++){ try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("當前的執行緒是:"+Thread.currentThread().getName()+"正在進行第"+j+"次迴圈,正在執行任務:"+task); } } }); } } }
執行緒池裡的三個程序每次從排隊佇列中取三個任務執行,直到執行完畢,再去等候佇列中取三個任務,執行。。。。。
執行結果:
2.threadPool.shutdown()和threadPool.shutdownNow()的區別
shutdown只是將執行緒池的狀態設定為SHUTWDOWN狀態,正在執行的任務會繼續執行下去,沒有被執行的則中斷。而shutdownNow則是將執行緒池的狀態設定為STOP,正在執行的任務則被停止,沒被執行任務的則返回。
舉個工人吃包子的例子,一個廠的工人(Workers)正在吃包子(可以理解為任務),假如接到shutdown的命令,那麼這個廠的工人們則會把手頭上的包子給吃完,沒有拿到手裡的籠子裡面的包子則不能吃!而如果接到shutdownNow的命令以後呢,這些工人們立刻停止吃包子,會把手頭上沒吃完的包子放下,更別提籠子裡的包子了。
參考地址: https://blog.csdn.net/horero/article/details/77622951
3.快取執行緒池的使用
//建立快取執行緒池
ExecutorService threadPool = Executors.newCachedThreadPool();
執行結果:
如果來十個任務,開啟十個執行緒去執行,做完任務,過一段時間釋放掉;
4.建立單一執行緒池(如何實現執行緒死掉重新啟動)
ExecutorService threadPool = Executors.newSingleThreadExecutor();
裡面只建立一個執行緒,如果執行緒死掉了,再建立一個新的執行緒替補它的工作
5.執行緒池定時器
建立一個爆破任務,5s後爆炸。
程式碼例項:
ScheduledExecutorService bombTaskThreadPool = Executors.newScheduledThreadPool(3);
bombTaskThreadPool.schedule(new Runnable() {
@Override
public void run() {
System.out.println("炸彈爆炸。。。。。");
}
}, 5, TimeUnit.SECONDS);
第一次在5s鍾以後炸,以後每2s炸一次
ScheduledExecutorService bombTaskThreadPool = Executors.newScheduledThreadPool(3);
bombTaskThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("炸彈爆炸。。。。。");
}
}, 5,2, TimeUnit.SECONDS);