2016-05-31 3 views
1

Рассмотрим следующий наш поток:Основной нитью проходит последовательность

public class HeavyWorkRunnable implements Runnable { 

    @Override 
    public void run() { 
     System.out.println("Doing heavy processing - START "+Thread.currentThread().getName()); 
     try { 
      doDBProcessing(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     System.out.println("Doing heavy processing - END "+Thread.currentThread().getName()); 
    } 

    private void doDBProcessing() throws InterruptedException { 
    // TODO 
    } 
} 

И главный метод:

public class ThreadRunExample { 
    public static void main(String[] args){ 

      Thread t1 = new Thread(new HeavyWorkRunnable(), "t1"); 
      Thread t2 = new Thread(new HeavyWorkRunnable(), "t2"); 
      System.out.println("Starting Runnable threads"); 

      t1.start(); 
      t2.start(); 
      System.out.println("Doing main heavy processing - START "+Thread.currentThread().getName()); 
      System.out.println("Runnable Threads has been started"); 
     } 
} 

Теперь выходы различны в разное время пробега. Например:

Output1:
Начиная Runnable темы
Doing основной тяжелой обработки - START основной
Выполнение интенсивной обработки - START t1
Выполнение интенсивной обработки - START t2
Выполнение тяжелой обработки - END t2
запускаемых потоков было начато
Выполнение тяжелой обработки - END t1

Выход2:
Начиная запускаемых потоков
Ведение основной тяжелой обработки - START основные
Runnable Темы Начата
Выполнение интенсивной обработки - START t1
Выполнение интенсивной обработки - END t1
Doing тяжелую обработку - START t2
Выполнение интенсивной обработки - END t2

согласно моему пониманию резьбы:
1. только один поток может работать одновременно.
2. Система выбирает потоки случайным образом для запуска, если приоритеты не заданы.

Итак, система должна выполнить задачи «основной» нити, а затем запустить либо t1, либо t2. Если это так, то выход всегда должен содержать:
Начиная Runnable темы
Doing основной тяжелой обработки - START основные
Runnable Темы Начата
как первые три строки. Я не понимаю, что пропустил в своем понимании.

+0

Почему бы вам не начать темы после того, как ваш основной поток напечатал свои сообщения? – Kayaman

+0

Что я могу сделать, чтобы получить этот вывод. Но моя забота заключается в том, что если в «основном» методе нет «sleep()», он должен работать в первую очередь. –

+0

Не совсем. Вы допустили ошибку, предполагая, что «Только один поток может запускаться за раз». – Kayaman

ответ

0

Вещь: варьируется между операционными системами и их очередями обработки. Это длинная тема, но длинный рассказ: Когда три потока находятся в системной очереди, ОС позволяет одному из них запускать только небольшую часть времени (называемую квантом), а затем толкает ее в очередь, чтобы позволить другим потоки и т. д., чтобы иметь иллюзию многозадачности в однопроцессорных одноядерных архитектурах. Для этого каждое исполнение будет отличаться по нескольким причинам.

Если вы действительно хотите погрузиться в эту тему, просто начать здесь link

0

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

При запуске темы он войдет в состояние runnable.Когда планировщик потоков имеет слот для времени обработки, он выберет один из всех потоков runnable (случайным образом, если все они имеют одинаковый приоритет). Выбранный входит в состояние running в течение нескольких миллисекунд до того, как планировщик потоков прерывает обработку и помещает поток обратно в состояние runnable.

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

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

Что вы можете проверить, так это сделать нить wait в других тонах (используя метод Object.wait()), но это далеко за пределами этого ответа.

Если вам нужно погрузиться в потоки в Java, вам следует рассмотреть конкретную подготовку или Google для онлайн-ресурсов, потому что это совсем не очевидно.

0

Прежде всего, позвольте мне понять, что Только один поток может работать в заданное время его значение true, но только для одноядерного процессора не для нескольких ядер.

Теперь главный метод - это не что иное, как внутренняя резьба. Теперь Threading Scheduling и Time Slicing зависит от ОС. Итак, когда вы запускаете свой основной метод программы, все еще его в Time Slice и, следовательно, выполняется оператор System.out.println("Doing main heavy processing - START "+Thread.currentThread().getName());, а также более операторы.

Если вы хотите изменить свой вывод, вам нужно удалить основную тему из временного фрагмента ОС.

Итак, после t2.start(); используйте Thread.sleep(1000), и вы можете проверить, что ваш поток t1 или t2 получит Планировщик и собирается выполнить.

+1

Получил это. Если в моей системе был один основной процессор, то я могу ожидать выход, как я уже упоминал ранее? –

+1

No @SumanBairagya. Наконец, это зависит от ОС и алгоритма планирования, а при многопоточности вы не можете прогнозировать вывод. – Darshit