Java Concurrent處理并發需求
4
java5開始,增加了concurrent
api,用于并發處理。比如起多個線程并發從網絡上下載圖片,然后在本地顯示。
這里寫個簡單的代碼,來說明如何使用concurrent api提供的線程連接池。
運行結果類似這樣:
如果沒有java自帶的這個api,需要自己或者使用不標準的第三方線程池api。用concurrent api寫起來很簡潔:
在main線程中直接運行了:
完整代碼:
這里寫個簡單的代碼,來說明如何使用concurrent api提供的線程連接池。
運行結果類似這樣:
start do 1 task …這里的task1到task3,都做的同樣的事情,讓它所屬的線程休眠2000ms:
>>main thread end.
start do 2 task …
start do 1 finished.
start do 3 task …
start do 2 finished.
start do 3 finished.
private static void doSomething(int id) { System.out.println("start do " + id + " task …"); try { Thread.sleep(1000 * 2); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("start do " + id + " finished."); }
如果沒有java自帶的這個api,需要自己或者使用不標準的第三方線程池api。用concurrent api寫起來很簡潔:
首先,創建了一個線程池,里面有2個線程:public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(2); executorService.submit(new Runnable() { @Override public void run() { doSomething(1); } }); executorService.submit(new Runnable() { @Override public void run() { doSomething(2); } }); executorService.submit(new Runnable() { @Override public void run() { doSomething(3); } }); executorService.shutdown(); System.out.println(">>main thread end."); }
ExecutorService executorService = Executors.newFixedThreadPool(2);然后,通過submit()方法,提交一個Runnable的實例,這個實例將交由線程池中空閑的線程執行。
在main線程中直接運行了:
executorService.shutdown();不必擔心,線程池不會直接關閉的,只有當它執行完所有提交的任務后才會關閉。如果不寫這行,在本例中,應用將不會停止,因為雖然main線程(就是運行main方法的線程,也叫主線程)退出了,但是線程池中依然有線程運行,因此應用(進程)不會退出。
完整代碼:
package com.easymorse.concurrent; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Demo { /** * @param args */ public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(2); executorService.submit(new Runnable() { @Override public void run() { doSomething(1); } }); executorService.submit(new Runnable() { @Override public void run() { doSomething(2); } }); executorService.submit(new Runnable() { @Override public void run() { doSomething(3); } }); executorService.shutdown(); System.out.println(">>main thread end."); } private static void doSomething(int id) { System.out.println("start do " + id + " task ..."); try { Thread.sleep(1000 * 2); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("start do " + id + " finished."); } }