[問題] 關於Executor運作原理

看板java作者 (喵!就是這樣!)時間11年前 (2012/11/21 14:08), 編輯推噓2(205)
留言7則, 4人參與, 最新討論串1/3 (看更多)
自從Java SE5後,提供了Executors管理Thread, 但是對於一些執行上的問題,我還是有一些疑惑,以下是測試程式碼: public class ThreadTest { public static void main(String[] args) { ThreadTest t = new ThreadTest(); ExecutorService exec = Executors.newFixedThreadPool( 1, t.new MyThreadFactory()); for (int i=0;i<5;i++) { exec.execute(t.new MyRunnable(i)); } exec.shutdown(); } public class MyThread extends Thread { private int id; public MyThread(Runnable r, int id) { super(r); this.id = id; } public void run() { super.run(); System.out.println("Thread ID: " + this.id); } } public class MyRunnable implements Runnable { private int id; public MyRunnable(int id) { this.id = id; } @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { } System.out.println("Runnable ID: " + this.id); } } public class MyThreadFactory implements ThreadFactory { private int id; public MyThreadFactory() { this.id = 0; } @Override public Thread newThread(Runnable r) { MyThread t = new MyThread(r, id++); return t; } } } 例子中,我丟了五個Runnable進ExecutorService執行,對於ThreadPool我不是很了解。 ThreadFactory產生了一個Thread,他會把五個Runnable都印完之後, 才會印他自己的ID。可是感覺上應該是一個Thread對到一個Runnable, 怎麼會五個Runnable都丟給了同一個Thread去執行呢? 它是怎麼做到讓五個Runnable的run()疊在一起變成super.run()? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.222.86.99

11/21 14:27, , 1F
大概是一些block之類的例如lock、wait那些東西
11/21 14:27, 1F

11/21 20:50, , 2F
直接看ExecutorService是怎麼寫的就好了不是?
11/21 20:50, 2F

11/21 21:22, , 3F
建議你看一下 Executors.newFixedThreadPool 的API
11/21 21:22, 3F

11/21 21:24, , 4F
把第一個參數的解釋看懂 你就知道為什麼你只有1個Thread
11/21 21:24, 4F

11/22 09:59, , 5F
二樓大大建議我會去看的
11/22 09:59, 5F

11/22 10:01, , 6F
三樓大大 我已經看過了 他用ThreadPoolExecutor產生限制
11/22 10:01, 6F

11/22 10:06, , 7F
Thread數量,但是他怎麼拿取BlockingQueue東西的實作
11/22 10:06, 7F
文章代碼(AID): #1Gh6_lE8 (java)
文章代碼(AID): #1Gh6_lE8 (java)