Przekazanie referencji do nowego wątku przez konstruktor

0

Witam. Mam pewien problem, otóż próbuję przekazać referencję obiektu do konstruktora innej klasy, którego wywołuję jako wątek. Otóż jestem w stanie się odwołać do tego obiektu z pozycji konstruktora, ale z poziomu metody run() już nie. Sęk w tym, że potrzebuję się odwołać do obiektu właśnie w tej metodzie.

W ten sposób przekazuję referencję obiektu do innej klasy.
new Thread(new StartSearchingThread(layoutEnvironment)).start()
A tutaj klasa tworząca wątek:

public class StartSearchingThread extends Thread {
	private LayoutEnvironment layoutEnvironment;
	
	public StartSearchingThread(LayoutEnvironment layoutEnvironment) {
		
		this.layoutEnvironment = layoutEnvironment;
		//layoutEnvironment.uiProgressBar.setVisible(true);
	}

	@Override
	public void run() {
		runSearchingThread(layoutEnvironment);
	}

	private void runSearchingThread(LayoutEnvironment layoutEnvironment2) {
		layoutEnvironment.uiDisplay.asyncExec(new Runnable() {
			public void run() {
				startDesignApp();

			}

			private void startDesignApp() {
				layoutEnvironment.uiStatusLabel.setText(Settings.SEARCHING_START);
				layoutEnvironment.uiProgressBar.setVisible(true);
				layoutEnvironment.uiSearchButton.setVisible(false);
				layoutEnvironment.uiDevicesListTable.setEnabled(false);
				layoutEnvironment.uiDevicesListTable.removeAll();
				layoutEnvironment.uiCancelButton.setVisible(true);
				try {
					//layoutEnvironment.uiManage.setEnabled(false);
					//layoutEnvironment.uiManage.setVisible(false);
				} catch (Exception e) {
					System.out.println(Settings.NOT_EXITS_MESSAGE);
				}
			}
		});
	}
} 
0
  1. new Thread(new StartSearchingThread(layoutEnvironment)) jest bez sensu skoro ta klasa rozszerza już Thread. Zrób jak normalny człowiek (new StartSearchingThread(layoutEnvironment)).start() i tyle.
  2. A gdzie dokładnie coś ci nie działa? Bo na oko jest ok. Oczywiście nie wiem po co przekazujesz POLE KLASY jako argument do METOD KLASY, skoro one i tak mają do tego pola dostęp, niemniej jednak nie powinien to być problem. Więc: GDZIE i JAKI jest błąd?
0

Ok, dzięki za radę co do 1 punktu. Co do drugiego to layoutEnvironment.uiStatusLabel.setText(Settings.SEARCHING_START); mam nullpointerexception.
A tutaj cały błąd.

Exception in thread "Thread-2" java.lang.NullPointerException
	at accessFinder.StartSearchingThread.runSearchingThread(StartSearchingThread.java:17)
	at accessFinder.StartSearchingThread.run(StartSearchingThread.java:13)
	at java.lang.Thread.run(Thread.java:745)
 
0
  1. OMG chłopie, ale co ty tam w ogóle wyprawiasz? Masz osobny wątek z którego odpalasz kolejny wątek który coś robi. Po co? o_O Nie możesz całej tej akcji wykonać w run() wątku?
  2. Rozumiem że nie uważasz że warto odpalić to pod debugerem i zobaczyć co jest nullem? Bo ja mysle że wcale nie to co ci sie wydaje...
0

Ponieważ wywołanie tego wątku asynchronicznie wymaga użycia drugiego raz wywołania run(). Skoro referencja przekazana do konstruktora jest poprawna i z poziomu konstruktora nie mam problemu z wywołaniem obiektu, a w metodzie run() mam nulla, to znaczy, że coś muszę robić źle z przekazaniem.

0

Skorzystaj z rady Shalom'a i odpal debug.
P.S. Przekazujesz parametr w metodzie i z niego nie korzystasz... Zresztą to ten sam obiekt...
private void runSearchingThread(LayoutEnvironment layoutEnvironment2) {
layoutEnvironment.uiDisplay.asyncExec(new Runnable() {

Sprawdź czy przypadkiem uiDisplay nie jest nullem.

0

Biały Młot miałeś rację, do uiDisplay nie przypisałem nic i było nullem. Argument w metodzie był do wywalenia, to prawda ;)

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