Я прочитал документацию Thread
и просмотрел несколько примеров, но я не могу заставить свой код работать должным образом. Я хочу гарантировать, что Thread
s выполняются в порядке t2, t3, t1, и я пытаюсь использовать метод join()
для этого.Thread.join(), чтобы гарантировать выполнение заказа
Из того, что я понимаю, join()
гарантирует, что экземпляр потока, который он вызывается, будет работать до тех пор, пока не будет убит, прежде чем продолжить выполнение следующего Thread
. Вот мой код:
public class ThreadyKrueger extends Thread {
private Thread t;
private String threadName;
public ThreadyKrueger(String name) {
this.threadName = name;
System.out.println("Creating thead, \"" + this.threadName + "\"");
}
@Override
public void run() {
try {
System.out.println("Job being run by " + this.threadName);
Thread.sleep(200);
} catch (InterruptedException e) {
System.out.println("Thread " + this.threadName + " interrupted!");
}
System.out.println(this.threadName + " exiting...");
}
@Override
public void start() {
System.out.println("Starting " + this.threadName);
if (t == null) {
t = new Thread(this, this.threadName);
}
t.start();
}
}
public class ThreadMain {
public static void main(String[] args) throws InterruptedException {
//ensure order is t2, t3, t1
ThreadyKrueger t2 = new ThreadyKrueger("T2");
ThreadyKrueger t3 = new ThreadyKrueger("T3");
ThreadyKrueger t1 = new ThreadyKrueger("T1");
t2.start();
t2.join();
t3.start();
t3.join();
t1.start();
}
И выход я получаю меняется каждый раз, но, например:
Creating thead, "T2"
Creating thead, "T3"
Creating thead, "T1"
Starting T2
Starting T3
Starting T1
Job being run by T2
Job being run by T3
Job being run by T1
T1 exiting...
T2 exiting...
T3 exiting...
Ясно T2 не убит до начала T3, и так далее. Что мне не хватает (кроме нескольких отступов и скобок, которые были потеряны при копировании/вставке). Спасибо.
Почему вы создаете «Thread», который запускает другой «Thread» (на котором вы не «присоединяетесь»)? Это очень обратное. Ваш 'Krueger' должен быть« Runnable ». –
Я вижу ... Я экспериментировал как с реализацией Runnable, так и с реализацией Thread, и, похоже, я их смешивал. Спасибо что подметил это. – hsotweelvl
Если вам нужен конкретный порядок выполнения **, почему вы используете потоки? ** – EJP