1. 程式人生 > >多執行緒學習----執行緒池(九)

多執行緒學習----執行緒池(九)

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);