Równoległe wykonywanie się wątków

0

Witam, otóż mam problem z wykonaniem funkcji Max równolegle. Dzieje się coś niewłaściwego - funkcja max wykonuje się tylko raz (w jednym wątku) zamiast tyle razy ile jest wątków. Błąd do wykrycia podczas wykonania programu. Zamieszczam kod poniżej:

 

package watki;

import static java.lang.Integer.parseInt;
import java.util.Random;
import java.util.Scanner;

public class Watki implements Runnable{
    Thread hebra;
    int inicio = 0, fin = 0;
    int tabla[];
    int result = 0;
    
    public int get_result()
    {
        return result;
    }
    
    public int max(int b[], int x, int y)
    {
        int a = 0;
        a = b[x];
        for(int i = x; i < y; i++)
        {
            if(a < b[i])
            {
                a = b[i];
            }
        }
        return a;
    }
    
    Watki(int tab[], int begin, int end)
    {
        inicio = begin;
        fin = end;
        tabla = new int [fin - inicio];
        
        for(int i = 0; i < fin - inicio; i++)
        {
            tabla[i] = tab[i+inicio];
        }
        hebra = new Thread(this);
        hebra.start();
    }
    @Override
    public void run()
    {
        // Para testear funcion
        try
        {
            System.out.println(Thread.currentThread());
            result = max(tabla, inicio, fin);
        }
        catch(Exception e)
        {
        }
    }
    
    public static void main(String[] args) throws InterruptedException {
    
        System.out.println("Podaj liczbe elementow ");
        Scanner odczyt = new Scanner(System.in);
        
        System.out.println("Podaj liczbe watkow ");
        Scanner odczyt2 = new Scanner(System.in);
        
        int N ,M;
        N = parseInt(odczyt.nextLine());
        M = parseInt(odczyt2.nextLine());
        
        int tabela[] = new int [N];
        int x = 0, y = 0, y1 = 0 , y2 = 0;
        
        Random generator = new Random();
     
        
        Watki[] wa = new Watki[M];
        
        for(int i = 0; i < N; i++)
        {
            tabela[i] = generator.nextInt(100);
        }     
        x = N/M;
        
        for(int i = 0; i < M; i++)
        {
            wa[i] = new Watki(tabela,i*x,((i+1)*x) - 1);             
        }
       
        for(int i = 0; i < M; i++)
        {
            System.out.println("Rezultat " + wa[i].get_result());
        }
        
    }
}

0

A gdzie wątek główny czeka na zakończenie obliczeń innych wątków?
Użyj np. CountDownLatch.

Btw. nie powinno się w konstruktorze przekazaywać this do innych obiektów.

0

W powyższym kodzie trzeba poprawić funkcję max - odbyło się przekroczenie indeksu tablicy:

public int max(int b[], int x, int y)
    {
        int a = 0;
        y = y - x;
        a = b[0];
        for(int i = 0; i < y; i++)
        {
            if(a < b[i])
            {
                a = b[i];
            }
        }
        return a;
    }

I poczekać na wątki, metodą synchronizującą lub Thread.sleep(1000); wywołaną w programie głównym. Temat uważam za zamknięty - dziękuję za odpowiedź!

0

I poczekać na wątki, metodą (...) Thread.sleep(1000); wywołaną w programie głównym

Huh. Miłego debugowania.
(...przy takim podejściu)

1 użytkowników online, w tym zalogowanych: 0, gości: 1