Java 1.5 開始,提供瞭線程池供大傢使用,功能還挺全的。下面是一個簡單的例子。復雜的例子將放在後面幾篇博客中。
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
* 固定大小線程池
*
* @author yiding.he
*/
public class FixedThreadPoolDemo {
public static void main(String[] args) {
// 創建一個最多同時運行 3 個任務的線程池
ExecutorService service = Executors.newFixedThreadPool(3);
// 安排若幹個任務運行
service.execute(new RunnableImpl(1));
service.execute(new RunnableImpl(2));
service.execute(new RunnableImpl(3));
service.execute(new RunnableImpl(4));
service.execute(new RunnableImpl(5));
service.execute(new RunnableImpl(6));
service.execute(new RunnableImpl(7));
service.execute(new RunnableImpl(8));
service.execute(new RunnableImpl(9));
service.execute(new RunnableImpl(10));
service.execute(new RunnableImpl(11));
service.execute(new RunnableImpl(12));
service.execute(new RunnableImpl(13));
service.execute(new RunnableImpl(14));
service.execute(new RunnableImpl(15));
// 結束線程池。shutdown() 不會馬上結束,而是等所有安排的任務執行完才結束。
service.shutdown();
// 如果不想馬上結束,又不願意等太長時間,那麼可以調用 awaitTermination() 方法等待一段時間
try {
service.awaitTermination(5, TimeUnit.SECONDS);
System.err.println(“等待時間已過”);
// shutdownNow() 將放棄所有正在等待的任務,等當前執行的任務全部完成之後,結束線程池。
List<Runnable> abandoned = service.shutdownNow();
System.err.println(“被遺棄的任務:” + abandoned);
} catch (InterruptedException e) {
e.printStackTrace();
System.exit(-1);
}
}
/////////////////////////////////////////
private static class RunnableImpl implements Runnable {
private int id;
private RunnableImpl(int id) {
this.id = id;
}
public void run() {
System.out.println(“開始執行” + id);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// nothing to do
}
System.out.println(id + “執行完畢。”);
}
@Override
public String toString() {
return “線程” + id;
}
}
}