Wątek z kolekcją - jak to właściwie zacząć?

0

hej, mam takie zadanie.

Napisz klasę, przechowującą tablicę (kolekcję) wartości całkowitych.
Napisz klasę, która jest wątkiem i z udostępnionej metody setInteger() z klasy wprowadzić losową wartość całkowitą co 10 sekund na ostatnią wolną pozycję tablicy (kolekcji). Podczas ustawiania wartości w metodzie setInteger() wyświetl ustawianą wartość na konsoli. Wątek ten uruchomić 2x.
Kolejny wątek ma co 3sek wyświetla kolejne wartości całkowite przechowywane z klasie i zwolnić miejsce.

wiem, że muszę użyć interfejsu Runnable, bo Thread ma metody, których już nie powinno się używać.

Ale jak mam to właściwie zacząć?

0

Proponuje od otwarcia dowolnego kursu javy.

0
import java.util.ArrayList;

public class World 
{
	private ArrayList<Integer> listaKolekcji = new ArrayList<Integer>();

	public void setInteger()
	{
		int random = (int) (Math.random()*100);
	
			listaKolekcji.add(random);
			System.out.println("Thread: "+ Thread.currentThread().getName()	+ " wartość: [" + random+"]");
	}
	
	public void usunWartosc()
	{
		if(listaKolekcji.size() > 0)
		{
			System.out.println("Usunieto: "+listaKolekcji.get(0));
			listaKolekcji.remove(0);

		} else {
			System.out.println("Nie mozna usuwać czegoś czego nie ma");
			
		}
	}
}
public class Test {

	public static void main(String[] args) 
	{
		World world= new World();
		
		TestWatku1 pierwszy = new TestWatku1(world);
		TestWatku2 drugi = new TestWatku2(world);
		
		Thread watek = new Thread(pierwszy);
		Thread watek1 = new Thread(pierwszy);
		Thread watek2 = new Thread(drugi);
		
		watek.start();
		watek1.start();
		watek2.start();
	}

}
import java.util.concurrent.TimeUnit;

public class TestWatku1 implements Runnable {
	public World world;

	public TestWatku1(World world) {
		this.world = world;
		// TODO Auto-generated constructor stub
	}

	@Override
	public void run() {
		while (true) {
			world.setInteger();

			try {
				TimeUnit.SECONDS.sleep(10);
			} catch (InterruptedException ie) {
				ie.printStackTrace();
			}

		}

	}
}
import java.util.concurrent.TimeUnit;

public class TestWatku2 implements Runnable 
{

	public World world;
	
	public TestWatku2(World world) 
	{
		this.world = world;
		// TODO Auto-generated constructor stub
	}

	@Override
	public void run() {
		while (true) {
			world.usunWartosc();

			try {
				TimeUnit.SECONDS.sleep(3);
			} catch (InterruptedException ie) {
				ie.printStackTrace();
			}
		}
	}
}

Czy dobrze jest to zrobione? I jak mogę ewentualnie to poprawić?

0

Jest źle, a nawet bardzo źle ;]

  1. Thread.sleep ma parametr w milisekundach a nie sekundach
  2. To ci w ogóle działa? Bo ja przeczuwam że leci ConcurrentModificationException. Nie możesz ot tak wieloma wątkami modyfikować kolekcji. Albo musisz synchronizować te metody modyfikujące kolekcje, albo użyć synchronizowanej listy albo jakiegoś ConcurrentLinkedQueue
0
Shalom napisał(a):

[...]
2. To ci w ogóle działa? [...]

Niby działa dobrze

1

Przypadek ;] Odpal więcej tych wątków, po 100 na przykład i musi się wysypać.

0

wysypało się,
synchronizowanie metod pomogło

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