2012-11-05 12 views
3

目前我有一個線程運行一個Socket來監聽連接。當它接收到一個連接時,它需要上傳在主線程中收集的數據(即從主線程獲取數據)。但是,我傳遞了對象的一個​​實例,但它從未更新過等待連接時收集的數據。當另一個事件發生時從主線程獲取數據?

有沒有適當的方法來做到這一點?我一直在搜索,似乎無法找到具體的答案。

難道有人指着我正確的方向嗎?


希望這是有道理的,但我會嘗試用示例解釋更多。

class MainThread { 
    private void MainThread() { 
     SomeObj obj = new SomeObj("DATA Needed"); 

     SecondThread second = new SecondThread(obj); 
     second.start(); 
    } 
} 

class SecondThread extends Thread { 
    SomeObj obj; 

    public void SecondThread(Object obj) { 
    this.obj = obj; 
    } 
    public void run() { 

    //Listening for connection 
    //Connection get! 
    //Get updated data (Object obj) from main thread. 
    //Upload 
    } 
} 

我很感激你能給我的任何幫助。請讓我知道如果我接近完全錯誤!我寧願學習並獲得答案,而不僅僅是獲得答案。

非常感謝!

回答

1

當它接收到一個連接時,它需要上傳在主線程中收集的數據(即從主線程獲取數據)。

這沒有意義,因爲你不從線程獲取信息,你會得到信息,並與對象通信。這是一個很大的區別。您需要將需要信息的對象的實例傳遞給需要此信息的第二個對象,可能作爲其構造函數中的一個參數。然後你可以在你的SecondThread類中用這個實例設置一個字段,你可以調用它的方法。

class MainThread { 
    private void MainThread() { 
     SomeType obj = new SomeType("DATA Needed"); 

     SecondThread second = new SecondThread(obj); 
     second.start(); 
    } 
} 

class SecondThread extends Thread { 
    SomeType obj; 

    public SecondThread(SomeType obj) { 
     this.obj = obj; 
    } 
    public void run() { 
     // can call methods on obj here 
    } 
} 

希望你實際上並沒有使用Object類型,而是一個更具體的類型的對象,對不對?

+0

對,我其實已經這麼做了,對不起,我忘了提。但是它們總是在等待時添加數據。編輯問題。 –

+0

@ChrisWood:請看我的編輯回答。 –

+0

謝謝,這是我一直在嘗試的,但是我得到的實例從未更新過等待連接時收集的數據。謝謝你的時間!(至於你的問題在你的答案的底部:是的。) –

2

有一組事件確保一個線程中的寫入在另一個線程中可見。線程創建就是其中之一,所以最初寫入obj的任何數據都應該在第二個線程中可用。

一個選項是在obj上同步。如果主線程只通過調用其同步方法來修改它,而第二線程從obj synchronized方法獲取數據,則主線程寫入將在第二線程中可見。

如果你真的想了解在Java中多線程,我建議Java Concurrency in Practice

1

擴展在我的氣墊船完整的鰻魚非常模糊的回答評論:

import java.util.concurrent.*; // BlockingQueue 

class MainThread { 
    private void MainThread() { 
     // BlockingQueue is designed to be used primarily for producer- 
     // consumer queues, so ALL implementations are thread-safe! 
     new UploaderThread(new LinkedBlockingQueue<Data>()).start(); 
    } 
} 

class UploaderThread extends Thread { 
    private final BlockingQueue<Data> _dataToBeUploaded; 
    public SecondThread(BlockingQueue<Data> dataToBeUploaded) { 
     _dataToBeUploaded = dataToBeUploaded; 
    } 
    public void run() { 
     while (true) { 
     // Retrieve the first element in the queue, if necessary waiting 
     // until an element becomes available. 
     upload(_dataToBeUploaded.take()); 
     } 
    } 
} 

乾杯。基思。

相關問題