Параллелизм - почему последняя инструкция в этой функции никогда не выполняется? - PullRequest
0 голосов
/ 24 ноября 2011

У меня есть этот код:

private void doSomething() throws InterruptedException {
    WorkerThread w= new WorkerThread(this);
    w.start();
    synchronized (synchObj) {
        while (!isDone) {
            synchObj.wait();
        }
    }
    System.out.println("End");
}

Где вызывающий класс реализует метод, который вызывает notifyAll() на synchObj, когда создается экземпляр WorkerThread.Все работает почти так, как ожидалось, за исключением того, что последний вызов System.out.println("End"); никогда не вызывается.Почему это так?

Редактировать: Вот остаток кода:

public class App implements Notifee {
    private boolean isDone = false;
    private final Object synchObj = new Object();
    /**
     * @param args
     */
    public static void main(String[] args) {
        App app = new App();
        for (int i = 0; i < 5; i++) {
            try {
                app.doSomething();
            } catch (InterruptedException e) {
                System.err.println("Didn't even start");
                e.printStackTrace();
            }
        }
    }       

    private void doSomething() throws InterruptedException {
        WorkerThread w= new WorkerThread(this);
        w.start();
        synchronized (synchObj) {
            while (!isDone) {
                synchObj.wait();
            }
        }
            System.out.println("End");
    }

    @Override
    public void letMeKnow() {
        synchronized (synchObj) {
            synchObj.notifyAll();
        }
    }       
}

public class WorkerThread extends Thread {
    private Notifee n;
    public WorkerThread(Notifee n){
        this.n = n;
    }

    @Override
    public void run() {
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        n.letMeKnow();
    }
}

1 Ответ

1 голос
/ 24 ноября 2011

Вы никогда не устанавливаете isDone на true.Также вы должны сделать это volatile.Вы, вероятно, должны добавить:

@Override
public void letMeKnow() {
    isDone = true;
    synchronized (synchObj) {
        synchObj.notifyAll();
    }
} 

Редактировать : Если вы хотите просто подождать, пока рабочий поток завершит вызов:

w.join();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...