Wątki komunikacja - locki

0

Witam mam za zadanie utworzyć program wielowątkowy . Ogólnie rzecz biorąc poruszany w nim problem to producent-konsument.
Zadanie 1. Sito Eratostenesa
Napisz program wielowątkowy, który wyznacza kolejne liczby pierwsze z poda-
nego zakresu (zakres określa użytkownik). Program ma działać na zasadzie:

Pierwszy wątek, zwany generatorem generuje kolejne liczby naturalne
począwszy od 2 i przekazuje do wątku sito

Wątki, zwane sitami - sito reprezentuje liczbę pierwszą i zatrzymuje wszyst-
kie liczby, które są podzielne przez tą liczbę pierwszą. Liczby niepodzielne
przesyłają do kolejnego sita.
Jeżeli kolejnego sita nie ma, to je tworzy.
Oznacza to, że została znaleziona nowa liczba pierwsza.
Po wypisaniu liczb pierwszych wszystkie wątki powinny zakończyć.
Napisałem już te klasy jednak mam mase błędów których nie mogę rozwikłać
POMOCY!!

 package generator;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author rafal
 */
public class Generator implements Runnable{
    
    private final Lock zamek = new ReentrantLock();
    private final Condition warunek= zamek.newCondition();
    private final Condition warunek2 = zamek.newCondition();
    private volatile Integer liczba = 2;
    private volatile Integer watki = 1;
    private volatile Integer dostep = 0;

    public Generator(){
        
    }
    
    
     public void poke()
    {
        zamek.lock();
        try{
            warunek.signalAll();
        }
        finally
        {
            zamek.unlock();
        }
        
        
    }
    
    public void run(){
        while(true){
            System.out.println("Generuje");
        generuj();
        try {
            warunek.await();
        } catch (InterruptedException ex) {
            Logger.getLogger(Generator.class.getName()).log(Level.SEVERE, null, ex);
        }
        }
    }
    
    public void generuj(){
        zamek.lock();
        ++liczba;
        zamek.unlock();
    }
    
    public Integer pobierz(){
        zamek.lock();
        try{return liczba;}
        finally{zamek.unlock();}
    }

    public void notif(){
        zamek.lock();
        warunek.notifyAll();
        zamek.unlock();
    }
    
    public void zwiekszLiczbeDostepow(){
        zamek.lock();
        try{++dostep;}
        finally{zamek.unlock();}
    }
    
    public void zresetujLiczbeDostepow(){
        zamek.lock();
        try{dostep=0;}
        finally{zamek.unlock();}
    }
    
    public Integer pobierzDostep(){
        zamek.lock();
        try{return dostep;}
        finally{zamek.unlock();}
    }
    
    public Integer pobierzWatki(){
        zamek.lock();
        try{return watki;}
        finally{zamek.unlock();}
    }
    public void zwiekszLiczbeWatkow(){
        zamek.lock();
        try{++watki;}
        finally{zamek.unlock();}
    }

    
}
package generator;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author rafal
 */
public class Sito implements Runnable{
    
    private Generator gen;
    private volatile Integer liczba;
    private final Lock zamek = new ReentrantLock();
    private final Condition warunek = zamek.newCondition();
    private Integer temp;
    
    public Sito(Integer i , Generator g){
        this.gen = g;
        this.liczba  = i;
    }
    

    
    public void run(){
        while(true){
        zamek.lock();
        try{
            System.out.println("Wchodze do sitka");
            this.temp = gen.pobierz();
            System.out.println(temp);
            gen.zwiekszLiczbeDostepow();
            System.out.println("Wchodze do sitka2");
            if(gen.pobierzDostep() == gen.pobierzWatki()){
                if(gen.pobierz() % liczba != 0){
                    System.out.println("Znaleziona pierwsza tworze nowe sito " + temp);
                    gen.zresetujLiczbeDostepow();
                    System.out.println("Polkuje");
                    Sito s = new Sito(gen.pobierz(), gen);
                    Thread t = new Thread(s);
                    t.start();
                    //  gen.poke();
                    warunek.notifyAll();
                }
            }
            
            System.out.println("Wchodze do sitka3");

            
        }
        finally{zamek.unlock();}
        System.out.println("Wchodze do sitka4");
        while(temp == gen.pobierz()){
            try {           
                warunek.await();
            } catch (InterruptedException ex) {
                Logger.getLogger(Sito.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        }  
    }
    
    
    public Integer pobierz(){
        zamek.lock();
        try{
        return liczba;
        }
        finally{zamek.unlock();}
    
    }
}
0

ogólnie rzecz biorąc nie zwracajcie uwagi na kod nie mam pomysłu jak komunikować ze sobą wątki sito. co ma być czym , proszę o pomoc.

2

A po co te locki ?

Weź stwórz sobie taki generyczny wątek (zaszalejmy !!! nazwijmy go aktorem, w końcu będzie zarzadzał kolejnymi)

	public static class NumberFilter extends Thread
	{
		private final int numberToFilter;

		private final NumberFilter previusFilter;

		private BlockingQueue numbersToFilter = new LinkedBlockingQueue<>();

		public NumberFilter(final int numberToFilter, final NumberFilter previousFilter)
		{
			this.previusFilter = previousFilter;
			this.numberToFilter = numberToFilter;
		}

		@Override
		public void run()
		{
			while(Thread.currentThread().isInterrupted()){
				try(){
					if(TO_TA_LICZBA_CO_CHCIALES){
						//... filtruj
					}else{
						//.. stworz kolejny watek
					}
				}catch(InterruptedException ex){
				   // UBIJ WSZYSTKIE PODLEGŁE, KTORE SWORZYLES W ELSE
				}
			}
		}

		public void filter(final int toFilter)
		{
			numbersToFilter.add(toFilter);
		}
	}

taki wątek miałby za zadanie, sprawdzenie czy jest tą liczą co tam chciałeś, a jak nie to stwórz nowy(taki sam,t ylko z innymi parametrami), potem jak nie będziesz miał więcej wartości do przetworzenia to niech producer ubije główny wątek i dalej pozamykają się same.
One same będą się komunikować kolejką (czyli ten wcześniejszy będzie pchał do kolejki następnemu ), bo tak chyba najprościej :)

Oczywiście purystycznie powinieneś mieć jakąś pule wątków ale domyślam się że raczej nie potrzebujesz :D Napisałbym dalej ale ide spać :D

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