Что происходит в этой программе, и, что более важно, почему? - PullRequest
0 голосов
/ 08 сентября 2010

Пожалуйста, помогите мне понять выполнение этой программы и какие концепции применимы здесь в более широком смысле? Будет полезна иллюстрация, которая объясняет создание и уничтожение потоков (ов) / стека (ов).

class Joining {

    static Thread createThread(final int i, final Thread t1) {
        Thread t2 = new Thread() {
            public void run() {
                System.out.println(i+1);
                try {
                    t1.join(); 
                } catch (InterruptedException ie) {
                }
                System.out.println(i+2);
            }
        };
        System.out.println(i+3);
        t2.start(); //1
        System.out.println(i+4);
        return t2;
    }
    public static void main(String[] args) {
        createThread(10, createThread(20, Thread.currentThread()));
    }
}

Ответы [ 3 ]

5 голосов
/ 08 сентября 2010
  1. Внутренний вызов createThread вызывается снизу из основного потока [M] с аргументами 20 и текущего потока.
  2. Этот вызов выводит 23.
  3. Aновый поток [A] запущен (и будет возвращен), который печатает 21, и ждет, когда основной поток [M] умрет (и напечатает 22 после того, как это произойдет).
  4. Этот вызов печатает 24. Этоневозможно знать, произойдет ли это до того, как новый поток [A] напечатает 21.
  5. Этот вызов возвращает новый поток [A], ожидающий смерти основного потока [M].
  6. Новый поток [A] передается в качестве второго аргумента в вызов createThread с первым аргументом в 10. 10.
  7. Этот вызов выводит 13.
  8. Запущен еще один новый поток [B](и будет возвращено, хотя никто не перехватит это возвращение), которое печатает 11 и ожидает смерти первого созданного потока [A] (и напечатает 12 после того, как это сделает).
  9. Этот вызов печатает 14. Этоневозможно знать, произойдет ли это до этого второго пew thread [B] печатает 11.
  10. Этот вызов возвращает второй новый поток [B], который ожидает смерти первого созданного потока [A], но с этим вызовом возврата ничего не делается.
  11. Основному потоку [M] не хватает дел и он умирает.
  12. Когда основной поток [M] умирает, возвращается вызов join () в первом созданном потоке [A].
  13. Первый созданный поток [A] печатает 22.
  14. Первый созданный поток [A] умирает.
  15. Когда первый созданный поток [A] умирает, объединение () вызов второго созданного потока [B] возвращает.
  16. Второй созданный поток [B] печатает 12.
  17. Второй созданный поток [B] умирает.
  18. JVM отключается, потому что все потоки умерли.
1 голос
/ 08 сентября 2010

Добавление некоторого отладочного вывода, вероятно, поможет вам понять выполнение:

import static java.lang.Thread.currentThread;

class Joining {

    static int count = 0;

    static Thread createThread(final int i, final Thread t1) {
        System.out.println("Create thread with " + i + " and " + t1.getName());
        Thread t2 = new Thread("Thread " + count++) {
            public void run() {
                System.out.println(currentThread().getName() + ": " + (i+1));
                try {
                    System.out.println(currentThread().getName() + ": join with " + t1.getName());
                    t1.join(); 
                } catch (InterruptedException ie) {
                }
                System.out.println(currentThread().getName() + ": " + (i+2));
            }
        };
        System.out.println(currentThread().getName() + ": " + (i+3));
        System.out.println(currentThread().getName() + ": starting thread " + t2.getName());
        t2.start(); //1
        System.out.println(currentThread().getName() + ": " + (i+4));
        return t2;
    }

    public static void main(String[] args) throws InterruptedException {
        Thread someThread = createThread(20, currentThread());
        System.out.println("After first createThread.");
        Thread.sleep(1000);
        createThread(10, someThread);
    }
}

Выход

Create thread with 20 and main
main: 23
main: starting thread Thread 0
main: 24
After first createThread.
Thread 0: 21
Thread 0: join with main
Create thread with 10 and Thread 0
main: 13
main: starting thread Thread 1
main: 14
Thread 1: 11
Thread 1: join with Thread 0
Thread 0: 22
Thread 1: 12
0 голосов
/ 08 сентября 2010

Хм ... мне кажется, что t1.join будет зависать навсегда при первом вызове createThread (20, Thread.currentThread)).

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