2012-03-31 2 views
1

Я попытался написать программу, которая использует потоки, но не могла понять o/p. У меня есть 2 потока: s и t. Но я не вижу, что работает нить s.Поведение темы: Java Beginner

Может ли кто-нибудь объяснить мне поведение? Благодаря

Мой код:

public class Bground implements Runnable 
{ 
    Thread t,s; 

    Bground() 
    { 
     t = new Thread(this,"first thread"); 
     s = new Thread(this,"second thread"); 

     s.start(); 
     t.start(); 
    } 

    public void run() 
    { 
     System.out.println("inside run" + t.getName()); 
     try 
     { 
      for (int i = 0; i < 5; i++) 
      { 
       System.out.println("In child thread" + i); 
      } 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String argv[]) 
    { 
     Bground b = new Bground(); 
     try 
     {     
      for (int i = 0; i < 5; i++) 
      { 
       System.out.println("In main thread" + i); 
       Thread.sleep(1); 
      } 
     } 
     catch(InterruptedException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

O/P:

C: \ Program Files \ Java \ jdk1.6.0_23 \ Bin> Java Bground

В главном thread0
Внутренняя рабочая нить
Внутренняя резьба в первом направлении
В детской резьбе0
В детстве thread1
В детстве thread2
В главном thread1
В детстве thread3
В детстве thread0
В детстве thread1
В детстве thread2
В детстве thread3
В детстве thread4
В главном thread2
В детской резьбе4
В основной теме3
В основной теме4

+5

Просто чтобы вы знали: каждый раз, когда вы форматируете свой код, Бог убивает котенка. –

+0

Рассмотрите возможность включения каждого потока в файл Thread.sleep (1000) '. Аргумент в миллисекундах. –

ответ

2

Что вы ожидаете распечатываются с:

System.out.println("inside run " + t.getName()); 

Вы не получаете имя текущего треда здесь, а вы всегда получать имя t-Thread. Исправить - получить текущую тему и позвонить по телефону getName().

+0

Да, извините, это было глупо. Я зарекомендовал себя новичком. :) – RVP

2

Вы печатаете название нити «t» дважды. это проблема. с другой стороны, нитки, казалось, работали на меня. вы можете использовать этот код вместо:

import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 


public class Bground implements Runnable { 
int name; 

Bground(int name) { 
    this.name=name; 
} 

public void run() { 
    System.out.println("inside run" + name); 
    try { 
     for (int i = 0; i < 5; i++) { 
      System.out.println("In child thread" + i); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public static void main(String argv[]) { 
    Bground b = new Bground(1); 
    Bground b2 = new Bground(2); 

    ExecutorService es = Executors.newFixedThreadPool(2); 
    es.submit(b); 
    es.submit(b2); 
    synchronized (es) { 
     es.notifyAll(); 
    } 

    try { 
     for (int i = 0; i < 5; i++) { 
      System.out.println("In main thread" + i); 
      Thread.sleep(1); 
     } 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

}