java 網絡編程(2.2)-----------採用線程池多線程的Socket 通信

還是先貼代碼吧。。真鬱悶,這裏代碼看起來不完全

 

 

直接取默認的任務數目爲5個,線程池中線程數目爲3個。。

那麼運行後的結果是

 

Task 0: start
Task 1: start
Task 2: start
嘿嘿,打個標記
Task 0: end
Task 3: start
Task 1: end
Task 4: start
Task 2: end
Task 3: end
Task 4: end

 

這個結果的意思是: 線程池中首先被放入了任務一二三,因爲才三個線程,所以之後當線程0被完成之後,線程纔有空出來執行任務3,然後當線程1被完成後纔有線程空出來來執行任務4.。然後任務2.3.4分別被執行完

 

。。這裏任務完成的順序是有序的原因是 Thread.sleep(500); 也就是每個任務執行的時間是相同的

 

 

然後解釋下代碼裏有一行     threadPool.join(); 與threadPool.close();的區別, 在網上看資料有說到:

 

線程池的join()和close()方法都可用來關閉線程池。join()方法確保在關閉線程池之前,工作線程把隊列中的所有任務都執行完。而close()方法則立即清空隊列,並且中斷所有的工作線程。

 

這個時候我試了下threadPool.close();果然,結果只能打印出

 

Task 0: start
Task 1: start
Task 2: start
嘿嘿,打個標記
Task 0: end
Task 1: end
Task 2: end

可以發現Task 3 . Task4都沒被執行。。。然後我鬱悶的事(其實是以前順序思想導致的)既然

  threadPool.close(); 語句是在 

 

for (int i=0; i<numTasks; i++)
      threadPool.execute(createTask(i)); 後,

 

那麼怎麼可能會有任務沒執行呢???????

後來我恍然大悟了一下,for語句只是執行了execute操作而已,而每個任務完成時需要時間的。

而一個for纔多少時間??

 

那麼是不是先for完然後就運行到了  threadPool.close();的呢? 於是我在  threadPool.close();之前

打了條語句,結果證實俺的想法。。也就是說 雖然把任務放到了線程中,但是放進去並不等於執行,

而這個時候程序的threadPool.close();卻已經執行了。。。。然後就發生了上面的結果。。

 

 

好了,這個代碼的兩個問題已經搞清楚了,最後一個問題也是有些鬱悶。。

 

 private static Runnable createTask(final int taskID)

 

這個函數怎麼可以這樣來返回一個對象呢,,哭了

 

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章