目前我有一个运行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
}
}
我感谢你能给我的任何帮助。如果我接近这个完全错误,请告诉我!我宁愿学习并得到答案而不仅仅是得到答案。
非常感谢!
答案 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());
}
}
}
干杯。基思。