多线程共享变量

时间:2015-06-08 14:15:49

标签: java multithreading

我有一个用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");
}
}

这是一个简单的例子......

1 个答案:

答案 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()几乎不是一种强有力的方法,在任何现实世界的场景中都应该避免使用。