Witajcie,
mam problem z zadaniem dotyczącym synchronizacji i koordynacji wątków. Analizowałem kod i internet wiele razy, mimo to nie udało mi się dojść do rozwiązania.
Po wystartowaniu wątku 1 (wczytywanie z pliku), po spełnieniu warunku przekazania sterowania do drugiego wątku - pierwszy zatrzymuje się ale drugi nie rozpoczyna pracy.
public class Main {
public static void main(String[] args)throws InterruptedException {
(new Thread(new Wczytywanie())).start();
(new Thread(new Weight())). start();
}
}
import java.util.ArrayList;
public class Towary {
int id_towaru;
double waga;
int idtest =1111;
double wagatest = 23131;
static int countobj = 0;
static int notifnewobj = 200;
public static ArrayList<Towary> listatowarow = new ArrayList<Towary>();
public Towary(int id_towaru, double waga){
this.id_towaru = id_towaru;
this.waga=waga;
countobj ++ ;
}
void add(int a, double b){
listatowarow.add(new Towary(a, b));
}
public static int countob(){
return countobj;
}
double returnweight(){
return waga;
}
}
import java.io.File;
import java.util.Scanner;
import java.io.FileNotFoundException;
public class Wczytywanie implements Runnable {
public static boolean state = false;
static int count = 0;
public void run() {
Scanner s;
try {
s = new Scanner(new File("C:/Users/Janusz/Desktop/Towary.txt"));
synchronized (this){
while (s.hasNext()){
if (count - Weight.counter > 1000){
System.out.println(count - Weight.counter);
state = true;
this.notifyAll();
}
while (state){
try {
this.wait();
} catch(InterruptedException exc) {}
}
count ++;
String[] data = s.nextLine().split("\\s+");
Towary.listatowarow.add(new Towary(Integer.parseInt(data[0]), Double.parseDouble(data[1])));
if(Towary.countob() % Towary.notifnewobj == 0){
System.out.println("utworzono " + Towary.countob() + " obiektów");
System.out.println("STATE " + state);
}
}
}
s.close();
state = true;
//notifyAll();
System.out.println("-------------/n TOTAL : utworzono " + Towary.countob() + " obiektów");
} catch (FileNotFoundException e) {
}
}
}
public class Weight implements Runnable{
static double actualweight;
static int counter = 0;
public void run(){
synchronized (this){
while(!(Wczytywanie.state))
{
try {
wait();
} catch(InterruptedException exc) {}
}
for (Towary t : Towary.listatowarow){
actualweight= actualweight + t.returnweight();
counter++;
if(counter % 100 == 0){
System.out.println("zważono " + counter + " obiektów");
}
if (Wczytywanie.count - counter < 10 ) Wczytywanie.state = false;
notifyAll();
}
System.out.println ("policzono wage " + Towary.countob() +" towarów");
System.out.println("-------------/n TOTAL : waga " + actualweight);
}
}
}
Bardzo prosze o wskazówki
niezdecydowanyniezdecydowany