2015-01-27 3 views
0

Я пытаюсь научиться использовать потоки в Java. В настоящее время я застрял в одном упражнении, где у меня есть три потока A, B и C, каждый с локальным массивом. Я хочу, чтобы три потока обменивались данными друг с другом, чтобы они могли найти минимально возможное число, которое взаимно (пересекается) со всеми локальными массивами. Если есть такой номер, я хочу, чтобы нить B напечатала его и закрыла другие потоки, если такого номера нет, я намерен закрыть программу. Каким может быть возможное решение? Как передать информацию между потоками в этом сценарии? Вот мой код до сих пор:Связь потоков в Java

import java.util.Random; 
import java.util.Arrays; 

public class MyThread implements Runnable { 
    private Thread thrd; 
    private Random randomInteger; 
    private int[] localArray; 

    MyThread(String name, int sizeOfLocalArray) { 
     localArray = new int[sizeOfLocalArray]; 
     randomInteger = new Random(); 

     for (int i = 0; i < localArray.length; i++) { 
      localArray[i] = randomInteger.nextInt(); 
     } 

     Arrays.sort(localArray); 

     thrd = new Thread(this, name); 
     thrd.start(); 
    } 

    @Override 
    public void run() { 
     System.out.println(thrd.getName() + " starting"); 

     for (int number : localArray) { 
      System.out.println(number + ", "); 
     } 
     System.out.println(); 

     System.out.println(thrd.getName() + " terminating"); 
    } 

} 

public class Main { 
    public static void main(String[] args) { 
     MyThread myThread = new MyThread("threadF", 5); 
    }  
} 
+0

Ну, потоки являются объектами и могут взаимодействовать друг с другом так же, как другие объекты. Я предлагаю сначала решить его без потоков: всего три обычных класса с локальными массивами. – lbalazscs

+0

Можете ли вы показать больше своей работы? Например, я вижу только один поток в вышеупомянутом приложении. Как запущены несколько потоков? Как они разделяют 'localArray'? – Gray

+0

Я понятия не имею, как его решить. Я много раз пробовал. Я сделал это без потоков, но я не вижу, как это можно применить к потокам. Как найти наименьшее число, общее для всех трех локальных таблиц, каждое из которых отличается от трех потоков. Спасибо за ответы. Я читал их все. Но любая дальнейшая помощь была бы велика. Как решить проблему? – Agness

ответ

0

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

Class ArrayHolder{ 
    private int[] localArray; 

    public ArrayHolder(){ 
     //initialize vars here 
    } 

    public synchronized int lowerstInterection(int[] intArray){ 
     //write the logic here 
    } 
} 

Теперь, когда вы строите ваши темы, передать его ArrayHolder через конструктор, как так

public class Main { 
    public static void main(String[] args) { 
     ArrayHolder arrayHolder = new ArrayHolder() 
     MyThread myThread = new MyThread("threadF", 5, arrayHolder); 
     MyThread myThread = new MyThread("threadG", 5, arrayHolder); 
     MyThread myThread = new MyThread("threadH", 5, arrayHolder); 
    }  
}