2016-01-09 3 views
-2

Я прочитал документацию 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, и так далее. Что мне не хватает (кроме нескольких отступов и скобок, которые были потеряны при копировании/вставке). Спасибо.

+1

Почему вы создаете «Thread», который запускает другой «Thread» (на котором вы не «присоединяетесь»)? Это очень обратное. Ваш 'Krueger' должен быть« Runnable ». –

+0

Я вижу ... Я экспериментировал как с реализацией Runnable, так и с реализацией Thread, и, похоже, я их смешивал. Спасибо что подметил это. – hsotweelvl

+2

Если вам нужен конкретный порядок выполнения **, почему вы используете потоки? ** – EJP

ответ

1

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

Runnable Используйте вместо подклассов Thread, чтобы избежать таких проблем.

Кроме того, я не вижу смысла для выполнения задач последовательно в отдельных потоках. Я создам список/очередь Runnable и обрабатываю это в цикле.

+0

Спасибо. Я пытался реализовать обе версии (расширяя «Thread» и внедряя «Runnable» и ошибочно смешивая код между ними. Очевидно, теперь, когда это было указано! – hsotweelvl

1

Тема, которую вы создали в основном, выполнена правильно, но по мере того, как каждый запускает свой собственный поток, они выполняются в параллелизме ... Нет необходимости создавать эти «подтемы». Удалите переопределенный метод start.

1

В вашем основном методе, когда вы выполняете, например, t2.start, вы находитесь в создании другого потока, когда вы выполняете t.start();

Лучшее aproach, это удалить метод запуска в вашем ThreadyKrueger класс.

Смежные вопросы