2012-06-18 3 views
2

может кто-нибудь сказать мне заказ, в котором поток начинает выполнять ?. Я написал следующий кодПолучение различного порядка нитей даже при запуске моей программы

class NewThread implements Runnable { 
    Thread t; 
    NewThread() { 
     //creating a second thread. 
     t=new Thread(this,"Demo Thread"); 
     System.out.println("Child Thread:"+t); 
     t.start(); 
    } 

    public void run() { 
     try { 
      for(int i=0;i<5;i++) { 
       System.out.println("Child Thread:"+i); 
       Thread.sleep(3000); 
      } 
     } catch(Exception e) { 
      System.out.println(e.getLocalizedMessage()); 
     } 
     System.out.println("Exiting Child Thread"); 
    } 
} 

и это

public class ThreadDemo { 
    public static void main(String args[]) { 
     new NewThread(); 
     try { 
      for(int i=0;i<5;i++) { 
       System.out.println("Main Thread:"+i); 
       Thread.sleep(3000); 
      } 
     } catch(Exception e) { 
      System.out.println(e.getLocalizedMessage()); 
     } 
     System.out.println("Exiting Main Thread"); 
    } 
} 

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

Child Thread:Thread[Demo Thread,5,main] 
Main Thread:0 
Child Thread:0 
Child Thread:1 
Main Thread:1 
Main Thread:2 
Child Thread:2 
Main Thread:3 
Child Thread:3 
Main Thread:4 
Child Thread:4 
Exiting Main Thread 
Exiting Child Thread 

другой,

Child Thread:Thread[Demo Thread,5,main] 
Main Thread:0 
Child Thread:0 
Child Thread:1 
Main Thread:1 
Child Thread:2 
Main Thread:2 
Child Thread:3 
Main Thread:3 
Child Thread:4 
Main Thread:4 
Exiting Child Thread 
Exiting Main Thread 

Почему это происходит? Будет ли порядок нитей никогда не быть таким же? и было бы неплохо, если бы кто-то мог дать мне указания на основы потоков и примеры. P.S: Я новичок в потоках, и это моя первая программа для потоков. Заранее спасибо.

+1

Никто не может. Это потоки. Они работают одновременно. Если вам требуется последовательное выполнение, зачем использовать потоки? – EJP

+0

Он не контролирует вашу программу, и вы не можете предсказать заказ. –

+0

Короткий ответ заключается в том, что он не определен. Но это сложный и большой предмет, и ни один из них не подходит для обучения по частям на SO. Я бы рекомендовал получить копию JCIP. – yshavit

ответ

8

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

Ожидается. Заказ не определен и зависит от условий гонки, поскольку потоки начинают работать и подвергаются потоковой планировке ОС.

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

+0

Должен ли я использовать синхронизацию потоков, чтобы следовать предопределенному порядку, и можете ли вы предоставить некоторые указатели для них. Заранее спасибо –

+1

Можете ли вы объяснить _why_, что вы хотите, чтобы заказ был определенным? Вся суть потоков заключается в параллельном запуске в отдельных процессорах, а не в блокировке с другими потоками. – Gray

+2

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

0

Вы столкнулись с состоянием гонки.

Вы столкнулись с одной из сложностей многопоточности. Если у вас есть код, который ДОЛЖЕН быть обработан в определенном порядке, вы должны «заблокировать» этот код и/или объявить переменные в нем «volatile». Запустите поиск Google для «взаимоблокировок» и «условий гонки».

0

Существует неявный порядок. Если у вас должен быть заказ, используйте ExecutorService с глубиной очереди 1.

+0

спасибо, исправлено –

+0

* ExecutorService с глубиной очереди 1. * будет работать только в том случае, если есть и один поток. – bestsss

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