2025-05-24

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


 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *