Невозможно понять работу Threads-Runnable Interface - PullRequest
0 голосов
/ 13 апреля 2011
public class Test {
    private static void funct(final int i) {
        new Thread(new Runnable() {
            public void run() {System.out.println(i);}
         }).start(); 
    }
    public static void main(String[] args) {
        System.out.println(1);
        funct (2);
        System.out.println(3);
        funct (4);
        System.out.println(5);
    }
}

Каждый раз, когда я запускаю его, я получаю одно из следующих решений.Почему так?1 3 5 4 2

1 3 5 2 4

1 3 2 5 4

Ответы [ 4 ]

4 голосов
/ 13 апреля 2011

Порядок, в котором будут распечатываться числа, в этом примере не определен. Единственное, что вы точно знаете, это то, что 1, 3 и 5 появятся в этом порядке. Но где в этом расположении 2 и 4 придет неизвестно. Причиной этого является то, что у вас есть 3 нити, которые распечатывают следующие номера: (1, 3, 5); (2) и (4). Три потока будут запланированы JVM, однако он определит, что будет лучше.

Многопоточное программирование - сложная тема, и, поскольку похоже, что вы только начинаете в нее углубляться, я бы порекомендовал раздел по параллелизму в руководстве по Java для Oracle:

1 голос
/ 13 апреля 2011

Потоки и асинхронность в целом являются сложными темами, но если не считать того, что в вашем случае потокам нужно немного раскрутиться, поэтому они чередуются с другими операторами печати в зависимости от того, какое время процессора у JVM ( и, в свою очередь, ОС) решает выделить эти потоки.

Я настоятельно рекомендую Брайану Гетцу и другим Брайану Гетцу Java-параллелизм на практике *, если вы хотите получить действительно твердое представление о том, что происходит.

1 голос
/ 13 апреля 2011

Потому что ваш основной поток иногда побеждает другие два потока. В других случаях нет.

У вас есть три темы; нет никакой гарантии, что она будет запущена в определенном порядке.

1 голос
/ 13 апреля 2011

Это потому, что вы не можете контролировать, какой поток создается первым. Это решено JVM. Только "1,3,5" будут в порядке, так как они выполняются из основного.

Этот вопрос может быть актуален: -

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