2013-11-27 27 views
-1
private ExecutorService executor1 = Executors.newFixedThreadPool(5); 

for(int i=0;i<10;i++) 
    executor1.execute(some runnable command); 

任何人都可以解釋上述2條語句中究竟發生了什麼嗎?在哪個語句中創建了一個新線程?創建了多少個新線程?Executor的'execute(Runnable command)'方法到底做了什麼?

+0

我認爲它的[javadoc的(http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executor.html#execute(java.lang中的到底是什麼.Runnable))說... – A4L

+1

*在將來某個時間執行給定的命令。該命令可以執行在新線程,池線程或調用線程中,由Executor實現決定。* –

回答

0

線程在您創建新的固定線程池時創建,但這些線程還沒有做任何事情。他們正在等待任務執行。

當您告訴固定線程池執行程序執行Runnable時,該runnable將被髮送到一個空閒線程,然後該空閒線程將開始與您的程序執行並行地運行。當Runnable終止時,完成的線程再次處於待機狀態,並等待進一步的工作。

當您指示執行程序服務在池中的所有線程都忙時執行runnables時,這些可運行的子程序將放入隊列中,並在可運行時完成時執行。

0

執行程序消息將執行您在不同線程中指定的可運行程序。

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個並行任務。希望我的解釋能幫助你。

+0

因此,當線程3完成任務並返回到池時,它將處於什麼狀態是?我的意思是,當線程3執行另一個任務時,是否重新啓動? – sree

+0

因此,當線程3完成任務並返回池時,它將處於什麼狀態?我的意思是,當線程3執行另一個任務時,是否重新啓動? – sree

+0

是的,當線程完成任務時,它將返回到池中。如果執行者有任何掛起的計劃任務,它將從線程池中選擇一個空閒線程並使用它來運行掛起的計劃任務。 –

0

查看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; 
} 
相關問題