2012-03-27 27 views
1

目前,我有一個while循環來監聽端口。當套接字接受連接時,將創建一個實現接口的任務,並將其分配給名爲o_allTaskThreadsLinkedList進行存儲。那是讓我控制住,阻止他們。如何控制大量的Java線程?

   s = this.o_ServerSocket.accept(); 
       System.out.println("connection established"); 

       PortListenTask plt = new PortListenTask(s,this.o_config); 
       this.o_allTaskThreads.add(plt); 
       plt.run(); 

但我得到了一些問題,在這裏,如果PortListenTask完成/完成或已異常terminaled,它不能更新LinkedList的o_allTaskThreads,我該怎麼解決呢?謝謝。

+3

您是否考慮過使用Java執行程序框架 - http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Executors.html它提供了線程池和其他有用的東西。 – fiction 2012-03-27 07:08:15

+0

'不能更新linkedLIst o_allTask​​Threads' - 爲什麼不?您應該點擊列表,重複它以查找條目並將其刪除。如果另一個線程/任務可能正在訪問它,你應該採取行動 - 設置一些inernal狀態爲'斷開',並將其放在一個定時器隊列中,以便最終刪除它的最後一個參考... – 2012-03-27 07:52:09

回答

1

當PortListenTask的run()方法結束(正常執行完成)時,它是否可以不更新鏈表(我假定要移除它自己)呢?如果圍繞run()方法的內容添加try/catch處理程序,那麼希望可以捕獲異常情況並通過相同的清理出口引導它們。你應該總是嘗試和信號一個線程退出本身,而不是放棄它們在外部,讓這樣一個乾淨的出口。

+0

+1爲'正常'的方法。該列表需要鎖定,但這應該起作用。 – 2012-03-27 07:48:12

2

LinkedList是不是很好的想法來存儲線程或工作。 嘗試閱讀Thread poolsThread pools and workers,這可能會有所幫助。

+0

[Executors.newCachedThreadPool](http ://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html#newCachedThreadPool%28%29)你有線程池。當線程結束時,它會回到池中。 – 2012-03-27 07:11:55

+0

你會解釋爲什麼LinkedList不是一個好主意嗎? – DNB5brims 2012-03-27 07:39:49

+0

你將在LinkedList中存儲所有的工作。所以會有線程正在運行並且已經被終止。根據「重用資源」的範例,這並不好。 並且LinkedList不同步,因此爲了提供對其數據的正確訪問,您應該手動對其進行同步。 ThreadPool在內部執行這兩個操作。 – 2012-03-27 08:05:28

0

您可以在每個PortListenTask中都有一個布爾值,指示它是否仍在運行,然後在循環線程時檢查該布爾值,如有必要使用remove(int index)將其從列表中刪除。 您也可以使列表成爲靜態列表,並從線程內的列表中刪除條目。

0

如果您使用較新版本的Java(jdk 6),請查看Future

如果您受到限制並想要其他方法,請嘗試使用觀察者可觀察模式。您可以使用'events'來實現相同。