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

Wątek z kolekcją - jak to właściwie zacząć?
CL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
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ąć?

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
0

Proponuje od otwarcia dowolnego kursu javy.

CL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0
Kopiuj
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");
			
		}
	}
}
Kopiuj
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();
	}

}
Kopiuj
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();
			}

		}

	}
}
Kopiuj
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ć?

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
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
CL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0
Shalom napisał(a):

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

Niby działa dobrze

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
1

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

CL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

wysypało się,
synchronizowanie metod pomogło

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.