2012-03-10 55 views
1

我有一個Java線程,我開始,所以它一直監聽套接字(考慮到套接字讀取阻塞線程是需要的)。Java線程來管理套接字並運行類方法

線程從套接字接收到數據後,需要調用一個類的方法。

現在我有兩個選擇這樣做:

聲明傳遞給線程,並在類中實現的接口。當線程調用接口方法時,實現類將運行它。

或者我可以將類實例作爲參數傳遞給線程,然後調用類方法。

但我想知道該方法正在運行時線程是否阻塞。

我想是這樣,但我不確定。

我希望線程具有Socket事件行爲。我的意思是隻負責讀取主類中的socket和fire函數中的數據,即稱爲線程的數據。

回答

2

是的,線程在執行方法時會阻塞,所以它不能同時從套接字讀取。沒有信息會丟失,傳輸只需要更長時間,如果計算時間過長,您可能會收到套接字超時。

如果你的方法需要很長時間才能運行,你應該在另一個工作線程中執行它。我建議爲此使用Executor

0

,但我想知道,如果線程塊的方法是運行

是它塊,而。
如果裏面run你打電話來處理事情,如果這是一個接口等,你問只在乎什麼做的方法也不要緊的方法實際上做

你的情況,你只有1選項。
確保您儘快將控件返回到套接字偵聽線程。
這可以通過設計/強制處理類來處理不同線程中的處理來實現。
其實你的問題不是新鮮事。在基於事件的設計中,需要儘可能快地處理事件,以便不阻塞基於事件隊列的流程。
這就是我會建議你設計的周圍。不使用任何接口與監聽線程交互,但註冊一個事件監聽器。

當一個事件發生時,即您的監聽線程讀取數據時,它會將數據作爲事件傳遞給您的監聽器,當然這個監聽器會阻塞它。
那麼你應該開始一個新的線程做加工和監聽線程可以繼續開展工作

2

你有多種選擇:

  • 讓你的類子類Thread的(更簡單的代碼,但你將合併函數部分 - 您的主代碼 - 與技術方面(擴展線程))
  • 讓您的類實現Runnable接口並使用該Runnable啓動一個新線程(我經常這樣做)。所以你的主代碼仍然保留在一個被覆蓋的運行方法中,但繼承樹取決於你(你的主類可以擴展你的其他類中的一個)
  • 保持主代碼/線程與兩個類分離主要代碼,一個用於線程),根據需要鏈接兩個線程(請記住,如果在另一個類中創建內部線程,則內部線程可以使用任何最終屬性)。

正如其他答案中所述,run()方法中發生的任何事情當然都會阻止執行。

作爲一個旁註,如果你打算處理線程和套接字,我強烈建議你看一下NIO框架,如Netty,這些行爲就是這樣的:通過事件驅動的客戶端/服務器應用程序NewIO插座。

至於另一個題外話,我經常使用這種模式:

  • 開始採集線程,將捕獲的事件;
  • 將它們推入linkedblockingqueue(queue.offer());
  • 有另一個線程共享相同的linkedblockingqueue(使用queue.take()):此操作爲阻塞,只要隊列爲空,線程將被阻塞;

這是一個非常簡單的方法,使一個線程作爲「生產者」,一個線程作爲「消費者」。您甚至可以讓不同的消費者在同一隊列中等待。

+0

+1用於引用NIO – 2012-03-10 16:02:09