dostęp do wartości z metody run

dostęp do wartości z metody run
PO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 92
0

Witajcie, Mam za zadanie obliczyć histogram pewnej tablicy za pomocą wątków. Postanowiłem, że podzielę tablicę na dwie połowy - pierwszy wątek będzie przeszukiwał pierwszą część, a drugi drugą.

Kopiuj
public class MyThread extends Thread
{
   private byte [] tab; // tablica wejsciowa
   private int [] tab2; // tablica wyjsciowa, przechowujaca histogram
   int suma = 0;
   
   public MyThread(byte []y, int []x)
   {
      this.tab = y;
      this.tab2 = x;
      
   }
  
   

   @Override
   public void run()
   {
	   for (int j = -128; j < 128; j++)
       {
           for (int i = 0; i < tab.length; i++)
           {
               if (tab[i] == j)
               {
                   tab2[j + 128] += 1;
                   
               }

           }    
         
       }
	   
	   
	   for (int i = 0; i<tab2.length; i++)
       {	 
             System.out.println(tab2[i]);
                
       }
}
   
}

Chciałbym metodzie Main, albo w jakiejkolwiek innej klasie dostać się do pola tablicy tab2. Na przykład tab2[1], tab2[2] bez wywoływania metody run. Kiedy w metodzie main wykonam np coś takiego:

Kopiuj
	
        byte[] w ;
		int [] histogram = new int[256];
		byte [] first ;
		byte [] second ;
		w = Files.readAllBytes(path);
		first = Arrays.copyOfRange(w, 1, w.length/2);
		second = Arrays.copyOfRange(w, w.length/2, w.length);
		MyThread t1 = new MyThread(first, histogram);
		MyThread t2 = new MyThread(second, histogram);
		t1.start();
		t2.start();
	
		System.out.println("*************" + histogram[1]); // chodzi mi o "dostanie" sie do tej wartosci, by nie zwracala zera

Otrzymuję wartość "0" dla każdego elementu tablicy histogram. W jaki sposób mogę dostać się do elementu zawierającego tę wartość nie wywołując metody run? Próbowałem dostać się za pomocą geta czy poprzez publiczny modyfikator tej tablicy, ale bez skutku... Z góry dzięki za pomoc.

dymul
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 182
1

Startujesz dwa wątki a potem odczytujesz wartość z tablicy wynikowej zanim wątki zdążą się wykonać i dlatego dostajesz zero. Zaczekaj, aż obydwa wątki skończą pracę i wtedy dopiero sprawdzaj wartość tablicy wynikowej. W Twoim przypadku najprościej będzie wykonać to poprzez:

Kopiuj
t1.start();
t2.start();

t1.join();
t2.join();
 
System.out.println("*************" + histogram[1]); // chodzi mi o "dostanie" sie do tej wartosci, by nie zwracala zera
Koziołek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Stacktrace
  • Postów: 6823
0

Pojęcie do przestudiowania - ForkJoin Framework. Tworzysz sobie RecursiveTask, który będzie zwracał tablicę intów:

Kopiuj
class HistogramTask extends RecursiveTask<int[]> {

	private static final int SIZE = 100;
	private final int[] array;
	private final int start;
	private final int end;
	private int[] histogram;
	private ArrayList<HistogramTask> subs = new ArrayList<>();

	public HistogramTask(int[] array, int start, int end) {

		this.array = array;
		this.start = start;
		this.end = end;
	}

	@Override
	protected int[] compute() {
		if (end - start < SIZE) {
			HistogramTask left = new HistogramTask(array, start, ((end - start) / 2));
			HistogramTask right = new HistogramTask(array, ((end - start) / 2), end);
			left.fork();
			right.fork();
			subs.add(left);
			subs.add(right);
		} else {
			histogram = new int[end - start];
			// liczysz histogram i zwracasz rezultat
			return histogram;
		}

		BinaryOperator<int[]> op = (l, r) ->{
			IntStream rs = Arrays.stream(l);
			IntStream ls = Arrays.stream(r);
			return IntStream.concat(ls, rs).toArray();
		};
		BiFunction<int[], ? super HistogramTask, int[]> f = (int[] h, HistogramTask t) -> {
			IntStream rs = Arrays.stream(t.getHistogram());
			IntStream ls = Arrays.stream(h);
			return IntStream.concat(ls, rs).toArray();
		};
		return subs.stream().reduce(new int[0], f, op);
	}

	public int[] getHistogram() {
		return histogram;
	}
}

i potem wystarczy to tylko uruchomić, ale to już zadanie dla ciebie :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.