Главное не ждать потоков даже после использования Thread.join () в Java - PullRequest
0 голосов
/ 15 сентября 2018

join () должен заставить функцию main ждать, пока все потоки не завершат выполнение, но main печатает completed до того, как Thread-1 и Thread-2 завершат выполнение.Я не могу найти ошибку в коде.в чем ошибка?

class ThreadDemo extends Thread {
    private Thread t;
    private String threadName;

    ThreadDemo(String name) {
        threadName = name;
    }
    public void run() {
        System.out.println("Thread " + threadName + " exiting.");
    }
    public void start() {
        if (t == null) {
            t = new Thread (this, threadName);
            t.start();
        }
    }
}
public class Problem2 {
    public static void main(String[] args) {
        ThreadDemo T1 = new ThreadDemo("Thread-1");
        ThreadDemo T2 = new ThreadDemo("Thread-2");
        T1.start();
        T2.start();
        try {
            T1.join();
            T2.join();
        } catch (InterruptedException e) {
            System.out.println("ERROR!");
        }
        System.out.println("completed");
    }
}

Вывод

completed
Thread Thread-2 exiting.
Thread Thread-1 exiting.

1 Ответ

0 голосов
/ 15 сентября 2018

Вы присоединяетесь к экземплярам ThreadDemo.Но вы не запускаете эти экземпляры как потоки.Ваш переопределенный метод start создает и запускает другой поток.

Ваш код очень запутанный.Вы используете наследование и делегирование, переопределяете методы и нарушаете их контракт: start () должен начинать this как поток, а не создавать и запускать другой поток.

Вот как это должно выглядеть:

class ThreadDemo implements Runnable {
    private String threadName;

    ThreadDemo(String name) {
        this.threadName = name;
    }

    @Override
    public void run() {
        System.out.println("Thread " + threadName + " exiting.");
    }

}
public class Problem2 {
    public static void main(String[] args) {
        ThreadDemo runnable1 = new ThreadDemo("Thread-1");
        ThreadDemo runnable2 = new ThreadDemo("Thread-2");

        Thread t1 = new Thread(runnable1);
        Thread t2 = new Thread(runnable2);

        t1.start();
        t2.start();
        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            System.out.println("ERROR!");
        }
        System.out.println("completed");
    }
}
...