Przekazanie referencji do nowego wątku przez konstruktor

Odpowiedz Nowy wątek
2015-01-03 14:15
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);
                }
            }
        });
    }
} 

Pozostało 580 znaków

2015-01-03 14:22
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?

Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.
Normalny człowiek skorzystał by z jakiegoś ExecutorService :P - airborn 2015-01-03 15:09

Pozostało 580 znaków

2015-01-03 14:30
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)

Pozostało 580 znaków

2015-01-03 14:36
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...

Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.

Pozostało 580 znaków

2015-01-03 15:16
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.

Pozostało 580 znaków

2015-01-03 17:13
Biały Młot
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.

Pozostało 580 znaków

2015-01-03 17:42
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 ;)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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