我有一个用Java开发的多线程应用程序。新的线程功能是运行网络协议客户端和服务器。
我的问题是在UDP“线程”中找到本地网络中的其他实例并将它们存储在List中。但是所有新线程都是由其他类(主线程)调用的命名线程。所以我的问题是在线程完成后获取处理后的列表。
我试图将列表传递给构造函数参数,然后让主线程等待该线程的结束,但是当它应该包含某些元素时,列表为空。
感谢。
使用示例代码进行编辑
public class MainClass{
public static void main(String[] args) {
List<String> tmp = new ArrayList<>();
Thread t1 = new Thread(UDPClient(tmp));
t1.start();
t1.join();
//It should be one but it'll be 0
System.out.println(tmp.size);
}
}
和separeted类:
public class UDPClient implements Runnable{
private List<String> foundInstances;
public UDPClient(List<String> instances)
{
foundInstances = instances;
}
public void run()
{
//do stuff
foundInstances.add("Hello world");
}
}
这是一个简单的例子......
答案 0 :(得分:0)
您可以使用各种方法在线程之间进行通信。以下示例代码说明了一个简单的代码。
import java.util.ArrayList;
import java.util.List;
public class MultiThreaded {
private static class ListAppender implements Runnable {
private List<String> strings;
private String string;
public ListAppender(List<String> strings, String string) {
this.strings = strings;
this.string = string;
}
@Override
public void run() {
strings.add(string);
}
}
private static class ListConsumer implements Runnable {
private List<String> strings;
public ListConsumer(List<String> strings) {
this.strings = strings;
}
@Override
public void run() {
for (String s : strings) {
System.out.println(s);
}
}
}
public static void main(String[] args) throws InterruptedException{
List<String> strings = new ArrayList<String>();
Thread helloThread = new Thread(new ListAppender(strings, "Hello"));
helloThread.start();
Thread worldThread = new Thread(new ListAppender(strings, "world!"));
worldThread.start();
Thread.sleep(1000);
new Thread(new ListConsumer(strings)).start();
}
}
所有三个线程都写入和读取同一个列表实例。请注意,上述方法实际上并不是任何措施的线程安全。您应该使用线程安全集合类。
Thread.sleep()
允许ListAppender
个实例在ListConsumer
运行之前完成。像这样使用Thread.sleep()
几乎不是一种强有力的方法,在任何现实世界的场景中都应该避免使用。