2015-06-08 2 views
0

У меня есть многопоточное приложение, разработанное на Java. Новые потоки fuction - это запуск клиентов и серверов сетевых протоколов.Многопоточные общие переменные

Моя проблема заключается в «потоке» UDP, чтобы найти другие экземпляры в локальной сети и сохранить их в списке. Но все новые потоки называются нитями, называемыми другими классами (основной поток). Поэтому моя проблема заключается в том, чтобы получить обработанный список после завершения потока.

Я попытался передать список параметру конструктора, и я делаю основной поток ожидающим конца этого потока, но тогда список пуст, когда он должен быть с некоторыми элементами.

Спасибо.

EDIT с примером кода

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 Никогда не предоставляйте дополнительную информацию, используя комментарии. Всегда редактируйте свой вопрос, чтобы улучшить его! И концепция, которую вы ищете, называется Futures (см. 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

Смежные вопросы