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寫起來很簡潔:
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.");
}
首先,創建了一個線程池,里面有2個線程: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.");
}
}