Jak zgrać dwa wątki operujące na tym samym ArrayList

0

Cześć,

Muszę napisać program działający w dwóch wątkach. 1. Wątek ma w pętli dodawać cyfry do mojej listy i wypisywać co 10 pętli napis "Utworzono x obiektów".
2. Wątek ma natomiast czytać listę i sumować jej pozycje no i co 30 zsumowań wypisywać "Zsumowano x liczb"

Sam program w sobie to banał, tylko jak to zsynchronizować żeby otrzymać wynik podobny do tego:

Utworzono 10 obiektów
Utworzono 20 obiektów
Utworzono 30 obiektów
Zsumowano 30 liczb
Utworzono 40 obiektów
Utworzono 50 obiektów
Utworzono 60 obiektów
Zsumowano 60 liczb
Utworzono 70 obiektów

Mam na razie tyle:


public class Test {
 
	public static void main(String[] args){
				
		AddTowar a = new AddTowar();
		CountTowar b = new CountTowar();
		a.start();
		b.start();
	}
}

////////////////////////////////////////////////

import java.util.ArrayList;

public class AddTowar extends Thread{

private static ArrayList<Integer> lista = new ArrayList<>();
	
	public void run(){
		for(int i = 0; i<1000; i++){
			lista.add(i);
			if(i%10==0)
			System.out.println("Utworzono " + i " obiektów");
	}

	public static ArrayList<Integer> getLista(){
		return lista;
	}
}

/////////////////////////////////////////////////////////////

public class CountTowar extends Thread{

	private int counter =0; 
	private int suma = 0;
	
	public void run(){

		for(int item: AddTowar.getLista()){
			counter++;
			suma += item;
			if(counter%30==0)
				System.out.println("Policzono wagę " + counter + " produktów");
		}
	}
}

Niestety to w ogóle ze sobą nie współgra, ponieważ w sumowaniu na starcie pobiera chyba pustą listę w skutek czego program wypisuje jedynie "utworzono x obiekótw".

Pomocy :/

0

To powinno Ci pomóc:

public class ThreadsDemo {
    public static void main(String[] args) {
        Q q = new Q();
        new Producer(q);
        new Consumer(q);

        System.out.println("Naciścnij Ctrl + C, aby zakonczyć...");
    }
}

class Q {
    int n;
    boolean valueSet = false;

    synchronized int get() {
        if (!valueSet)
            try {
                wait();
            } catch (InterruptedException ex) {
                System.out.println("Złapano InterruptedException");
            }

        System.out.println("Pobrano: " + n);
        valueSet = false;
        notify();
        return n;
    }

    synchronized void put(int n) {
        if (valueSet)
            try {
                wait();
            } catch (InterruptedException ex) {
                System.out.println("Złapano InterruptedException");
            }

        this.n = n;
        valueSet = true;
        System.out.println("Włożono: " + n);
        notify();
    }
}

class Producer implements Runnable {
    Q q;

    Producer(Q q) {
        this.q = q;
        new Thread(this, "Producent").start();
    }

    @Override
    public void run() {
        int i = 0;

        while (true) {
            q.put(i++);
        }
    }
}

class Consumer implements Runnable {
    Q q;

    Consumer(Q q) {
        this.q = q;
        new Thread(this, "Konsumer").start();
    }

    @Override
    public void run() {
        while (true) {
            q.get();
        }
    }
}
0

Dzięki wielkie :)

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