Pobieranie danych w osobnym wątku

0

Witam serdecznie,
Próbuję zaimplementować następującą rzecz:

Jest baza danych, jest sobie JTable, teraz przy wybraniu danego wiersza z tableki chcę zaciągnąć z bazy obrazek odpowiadający danemu wierszowi. Samo wczytywanie chcę natomiast odpalić w osobnym wątku. Wiec zrobiłem coś takiego:

table.getSelectionModel().addListSelectionListener(
				new ListSelectionListener() {
					public void valueChanged(ListSelectionEvent arg0) {
						final int row = table.getSelectedRow();
						synchronized (ClientView.this) {
							if (table.getValueAt(row, getColumnWithObject()) != null) {
								System.out.println("start");
								threadPhoto.setRow(row);
								if (!threadPhoto.isAlive())
									threadPhoto.start();
								else
									threadPhoto.resume();
							}
							else
								labelPhoto.setIcon(null);
						}
					}

Natomiast sama klasa Threada wygląda tak:

private class ThreadPhoto extends Thread {
		private int row;

		@SuppressWarnings("deprecation")
		public void run() {
			synchronized (mutex) {
				while (true) {
					labelPhoto.setIcon(((Client) table.getValueAt(row,
							getColumnWithObject())).getPhoto());
					System.out.println("koniec runa");
					this.suspend();
				}
			}
		}

		/**
		 * Zwraca wartosc pola
		 * @return wartosc pola row.
		 */
		public int getRow() {
			return row;
		}

		/**
		 * Ustawia wartosc pola
		 * @param row Nowa wartosc row do ustawienia.
		 */
		public void setRow(int row) {
			this.row = row;
		}
	}

I zmienna:

	private ThreadPhoto threadPhoto = new ThreadPhoto();

I Niby działa, ale jak szybko kursorem przejade w dół tabelki to przez te wątki nie zawsze zostanie wyświetlone poprawne zdjęcie. Czasami to które był wczesniej, czasami całkiem inne które było dużo wczesniej. Wiem dlaczego tak się dzieje, ale nie wiem jak to zrobić aby zachować kolejność wykonywania wątków...
Mam nadzieje ze jasno opisałem
Pozdrawiam i liczę na jakieś propozycję rozwiązania tego problemu ;)

0

Metoda notify() i nazwa wątku (można ustawić w konstruktorze). Z drugiej strony po co wątki jeżeli mają działać w kolejności?

0

Ok zobaczę, dzieki ;), a wątki tylko i wyłącznie dlatego aby nie blokować aplikacji jak baza padnie, albo będzie bardzo obciążona

0

Jeżeli baza padnie nie ma sensu kombinować. Jakoś (sprawa indywidualna dla frameworku lub "z palca") przechwycisz wyjątek i poinformujesz użytkownika. Jeżeli chcesz elegancko ładować dane to można to podzielić na etapy (tak jak zrobiłeś), ale jeszcze dodatkowo obudować całość wzorcem obserwator. W skrócie w momencie zakończenia ładowania loader (obserwowany) poinformuje generator widoku (obserwatora), że zakończył ładowanie i można już korzystać z nowych danych. W tym momencie uruchamiasz wątek, który będzie w locie aktualizował tabelkę.

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