2015-06-08 155 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