2015-06-08 154 views
0

我用Java开发的多线程应用程序。新线程功能是运行网络协议客户端和服务器。多线程共享变量

我的问题是在UDP“线程”,找到其他情况下,本地网络中,并将它们存储在列表中。但是所有新线程都是由其他类(主线程)调用的命名线程。所以我的问题是线程完成后得到处理列表。

我试图通过列表构造函数的参数,我让主线程等待线程结束,但随后列表为空时,它应该与一些元素。

谢谢。

编辑与示例代码

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

那么你想通过一个列表?有线程安全列表,你可以在这里找到他们选择最好的一个适合你http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/package-summary.html –

+0

让我们想象一下我有2个线程:运行udp客户端(命名线程,分离类)的主要线程和其他线程...在主线程中,我使用udp客户端类创建一个新线程并启动它。我如何从主线内的线程中获取找到的实例? 我试图通过参数来传递一个列表到UDP类的构造和使用,但我不能使用,因为该列表是在结束时清空。 – nervousDev

+0

@nervousDev从不使用评论提供更多信息。始终编​​辑您的问题以改进它!你可能会寻找这一概念被称为期货(见https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html) – GhostCat

回答

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

+0

我的这种解决方案的问题是我有命名线程类...我不能使用相同的变量。谢谢。 – nervousDev

+0

@nervousDev如何将列表传递给Runnable实例并没有太大区别。它“以任何方式工作”。 :)我更新了我的示例代码,不使用静态变量。 – Kallja