作者FrankWOO (喵!就是這樣!)
看板java
標題[問題] 關於Executor運作原理
時間Wed Nov 21 14:08:45 2012
自從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
推 LaPass:大概是一些block之類的例如lock、wait那些東西 11/21 14:27
推 cowbaying:直接看ExecutorService是怎麼寫的就好了不是? 11/21 20:50
→ samtree:建議你看一下 Executors.newFixedThreadPool 的API 11/21 21:22
→ samtree:把第一個參數的解釋看懂 你就知道為什麼你只有1個Thread 11/21 21:24
→ FrankWOO:二樓大大建議我會去看的 11/22 09:59
→ FrankWOO:三樓大大 我已經看過了 他用ThreadPoolExecutor產生限制 11/22 10:01
→ FrankWOO:Thread數量,但是他怎麼拿取BlockingQueue東西的實作 11/22 10:06