3

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

有没有合适的方法来做到这一点?我用谷歌搜索了一下,似乎找不到具体的答案。

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


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

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

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

非常感谢!

4

3 回答 3

2

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

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

如果你真的想学习 Java 中的多线程,我推荐Java Concurrency in Practice

于 2012-11-05T04:15:07.307 回答
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()); 
      }
    }
}

干杯。基思。

于 2012-11-05T04:29:52.050 回答
1

当它接收到一个连接时,它需要上传在主线程中收集的数据(即从主线程中抓取数据)。

这没有意义,因为您没有从Threads获取信息,而是获取信息并与Objects进行通信。这是一个很大的区别。您需要将需要信息的对象的实例传递给需要此信息的第二个对象,可能作为其构造函数中的参数。然后,您将使用此实例在 SecondThread 类中设置一个字段,您可以在其上调用方法。

IE,

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 类型,而是使用更具体的对象类型,对吧?

于 2012-11-05T03:54:15.117 回答