private ExecutorService executor1 = Executors.newFixedThreadPool(5);
for(int i=0;i<10;i++)
executor1.execute(some runnable command);
任何人都可以解釋上述2條語句中究竟發生了什麼嗎?在哪個語句中創建了一個新線程?創建了多少個新線程?Executor的'execute(Runnable command)'方法到底做了什麼?
private ExecutorService executor1 = Executors.newFixedThreadPool(5);
for(int i=0;i<10;i++)
executor1.execute(some runnable command);
任何人都可以解釋上述2條語句中究竟發生了什麼嗎?在哪個語句中創建了一個新線程?創建了多少個新線程?Executor的'execute(Runnable command)'方法到底做了什麼?
線程在您創建新的固定線程池時創建,但這些線程還沒有做任何事情。他們正在等待任務執行。
當您告訴固定線程池執行程序執行Runnable
時,該runnable將被髮送到一個空閒線程,然後該空閒線程將開始與您的程序執行並行地運行。當Runnable
終止時,完成的線程再次處於待機狀態,並等待進一步的工作。
當您指示執行程序服務在池中的所有線程都忙時執行runnables時,這些可運行的子程序將放入隊列中,並在可運行時完成時執行。
執行程序消息將執行您在不同線程中指定的可運行程序。
private ExecutorService executor1 = Executors.newFixedThreadPool(5);
表示您正在其線程池中創建5個線程的執行程序對象。所以當有請求進入時,它將使用這五個線程中的一個線程並執行請求。
for(int i=0;i<10;i++)
executor1.execute(some runnable command);
此聲明表示您提供的執行器服務有10個任務。由於執行程序有5個線程,它將開始執行前5個任務,後面的任務將被安排執行。當前五個任務完成時,該線程將返回到線程池,然後分配給執行第6個任務。
例如:
線程1:正在執行的任務1
線程2:執行的任務2
線程3:執行任務3
線程4:執行任務4
線程5:執行任務5
假設線程3完成其工作,則:
線程3:執行任務6
此後假定線程1完成其工作:
線程1:執行任務7
等。 ...
直到所有的計劃任務完成。由於線程池的大小爲5,因此一次最多隻能執行5個並行任務。希望我的解釋能幫助你。
查看ThreadPoolExecutor.execute()方法的源代碼。
方法1:檢查ThreadPool大小和池運行狀態。
public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();
if (poolSize >= corePoolSize || !addIfUnderCorePoolSize(command)) {
if (runState == RUNNING && workQueue.offer(command)) {
if (runState != RUNNING || poolSize == 0)
ensureQueuedTaskHandled(command);
}
else if (!addIfUnderMaximumPoolSize(command))
reject(command); // is shutdown or saturated
}
}
方法2:
private void ensureQueuedTaskHandled(Runnable command) {
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
boolean reject = false;
Thread t = null;
try {
int state = runState;
if (state != RUNNING && workQueue.remove(command))
reject = true;
else if (state < STOP &&
poolSize < Math.max(corePoolSize, 1) &&
!workQueue.isEmpty())
t = addThread(null);
} finally {
mainLock.unlock();
}
if (reject)
reject(command);
else if (t != null)
t.start();
}
方法3:要創建和使用runnalbe.run()方法啓動一個線程。
private Thread addThread(Runnable firstTask) {
Worker w = new Worker(firstTask);
Thread t = threadFactory.newThread(w);
if (t != null) {
w.thread = t;
workers.add(w);
int nt = ++poolSize;
if (nt > largestPoolSize)
largestPoolSize = nt;
}
return t;
}
我認爲它的[javadoc的(http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executor.html#execute(java.lang中的到底是什麼.Runnable))說... – A4L
*在將來某個時間執行給定的命令。該命令可以執行在新線程,池線程或調用線程中,由Executor實現決定。* –