2016-06-26 7 views
0
class MyThread extends Thread 
    { 
     public void run() 
     { 
      try 
      { 
       for(int i=0 ; i<10 ; i++) 
       { 
        System.out.println("I am Lazy Thread."); 
        Thread.sleep(2000); 
       } 
      } 
      catch (InterruptedException e) 
      { 
        System.out.println("I got interrrupted.");    
      } 
     } 
    } 
    class Test 
    { 
     public static void main(String[] args) 
     { 
      MyThread t = new MyThread(); 
      t.start();  //after this line 
      t.interrupt(); 
      System.out.println("end of main."); 
     } 

    } 

После t.start(); и t.interrupt(); почему это печать конца основного первого затем заявления ребенка нити.Multi-Threading в JAVA концепциях

В соответствии с концепцией многопоточности это может быть также оператор потока дочерних классов, но он всегда выполняет основной оператор Thread.

Какова концепция и рабочая процедура за этим. Потому что он всегда выполняет конец основного первым, чем другие.

ответ

1

После t.start(); есть две темы один главного и другое ребенок нити.

оба потока независимы друг от друга ...: инициализация основной нити уже выполнена до создания дочернего потока и для CPU (Thread Scheduler: T.S.) Его легко обрабатывать и исполнять main thread сначала, чем child thread. Если T.S. идет для выполнения дочерних потоков, чем определенно, для завершения потребуется больше времени. Существует некоторый алгоритм, который работает внутри T.S. какие нити он хочет выбрать первым, и он всегда меняется в зависимости от T.S. к Т.С.

+0

спасибо за разъяснение – fool

4

Почему это печатает конец основного первого, а затем заявление о поточном потоке.

Это потому, что каждый поток работает независимо, что является точкой.

Какова концепция и рабочая процедура позади этого. Потому что он всегда выполняет конец первого, чем другие.

В частности, потоки занимают время, чтобы начать, намного дольше, чем время, необходимое для завершения метода main().

Вы можете замедлить основной поток, чтобы увидеть, как это происходит больше, как вы ожидаете.

public static void main(String[] args) throws InterruptedException { 
     MyThread t = new MyThread(); 
     t.start();  //after this line 
     Thread.sleep(1); // thread might not start in this time or might complete. 
     t.interrupt(); 
     Thread.sleep(1); 
     System.out.println("end of main."); 
    } 

В самом деле, 1 милли-вторых может быть слишком длинным, как центральный процессор может выполнять 3000000 инструкции в милли-секунды.

+1

В частности, 'interrupt()' просто отправляет сообщение в другой поток, на который он будет действовать, только когда придет его очередь на запуск. – biziclop

+0

его значение, если мы не пишем 'Thread.sleep (1);', чем всегда, это касается только содержимого основного потока. – fool

+0

Потому что в некоторых случаях я видел, что это зависит только от JVM. какой поток JVM хочет выбрать, его случайный я думаю, и он не всегда идет на поток, который занимает меньше времени отклика. исправьте меня, если я ошибаюсь – fool

1

Как документы говорят

общественность недействительного прерывания()

Прерывание этой темы.

Если текущий поток не прерывает себя, что всегда разрешено, вызывается метод checkAccess этого потока, что может вызвать выброс SecurityException.

Если этот поток заблокирован при вызове методов wait(), wait (long) или wait (long, int) класса Object или join(), join (long), join() long, int), sleep (long) или sleep (long, int), методы этого класса, тогда его статус прерывания будет очищен, и он получит InterruptedException.

Если этот поток заблокирован в операции ввода-вывода по прерывистому каналу, тогда канал будет закрыт, статус прерывания потока будет установлен, и поток получит исключение ClosedByInterruptException.

Если этот поток заблокирован в Селекторе, тогда будет установлен статус прерывания потока, и он немедленно вернется из операции выбора, возможно, с ненулевым значением, как если бы был вызван метод пробуждения селектора.

Если ни одно из предыдущих условий не было выполнено, статус прерывания этого потока будет установлен.

Прерывание нити, которая не жива, не нуждается в каком-либо эффекте.

Броски: SecurityException - если текущий поток не может изменить эту нить

Примечание: С помощью нитей вы не получаете никаких гарантий в том порядке, как все будет выполнено, если явно не синхронизировать их

+0

** Примечание. В потоках вы не получаете никакой гарантии в порядке выполнения вещей, если вы явно не синхронизируете их **, это то, что вы говорите. Итак, как это происходит только для инструкции 'end of main' ... ... в некоторых случаях это может быть и дочерний поток, но я выполняю этот код много раз, чем тот же результат. – fool

+0

@fool Нет гарантии означает отсутствие гарантии. Это может быть тот же порядок 999 раз, затем другой порядок в 1000 раз. – biziclop

+0

@fool Как только вы вызываете t.start(), у вас есть два потока в вашей системе. Теперь его работа планировщика CPU забирает один из них и запускает его, затем переключается на другого, забирает и запускает Это . В этот момент, в котором поток будет работать, доходит до того, какой поток будет обрабатываться процессором, и этот процесс имеет так много разных переменных, с помощью которых он может быть активирован. Дело здесь в том, что вы можете запускать и получать один и тот же заказ 10 000 раз, но в 10 001-й раз вы можете получить другой порядок выполнения, на другой машине для одной и той же программы могут быть разные. – Zulfi

1

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