当另一个东西发生时,从主线程获取数据?

时间:2012-11-05 03:51:37

标签: java multithreading

目前我有一个运行Socket的线程侦听连接。当它接收到连接时,它需要上传在主线程中收集的数据(即从主线程中获取数据)。但是,我传递了一个Object的实例,但它从未使用在等待连接时收集的数据进行更新。

有没有正确的方法呢?我google了一下,似乎无法找到具体的答案。

有人能指出我正确的方向吗?


希望这是有道理的,但我会尝试用一些例子来解释更多。

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
    }
}

我感谢你能给我的任何帮助。如果我接近这个完全错误,请告诉我!我宁愿学习并得到答案而不仅仅是得到答案。

非常感谢!

3 个答案:

答案 0 :(得分:2)

有一组有限的事件可确保一个线程中的写入在另一个线程中可见。线程创建就是其中之一,因此最初写入obj的任何数据都应该在第二个线程中可用。

一种选择是在obj上同步。如果主线程仅通过调用其synchronized方法修改它,而第二个线程从obj synchronized方法获取数据,则主线程写入将在第二个线程中可见。

如果您真的想了解Java中的多线程,我建议Java Concurrency in Practice

答案 1 :(得分: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类型,而是更具体的对象类型,对吗?

答案 2 :(得分:1)

扩展我对Hovercraft Full Of Eels的相当神秘的评论回答:

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()); 
      }
    }
}

干杯。基思。