2013-04-02 9 views
0

Java код:Ребенка не работает здесь

// Create a second thread. 
class NewThread implements Runnable 
{ 
    Thread t; 
    NewThread() 
    { 
     t = new Thread(this, "Demo Thread"); // Create a new, second thread 
     System.out.println("Child thread: " + t); 
     t.start();    // Start the thread 
    } 
    public void run() // This is the entry point for the second thread. 
    { 
     justCall(); 
    } 
    public synchronized void justCall() 
    { 
     try 
     { 
       for(int i = 10; i > 0; i--) 
       { 
        System.out.println("Child Thread: " + i); 
        Thread.sleep(10000); 
       } 

     } 
     catch (Exception e) 
     { 
      System.out.println("Child interrupted."); 
     } 
     System.out.println("Exiting child thread."); 
    } 
} 
class ThreadDemo 
{ 
    public static void main(String args[]) 
    { 
     NewThread nt = new NewThread();   // create a new thread 
     try 
     { 
      for(int i = 5; i > 0; i--) 
      { 
       System.out.println("Main Thread: " + i); 
       Thread.sleep(1000); 
      } 
     } 
     catch (InterruptedException e) 
     { 
      System.out.println("Main thread interrupted."); 
     } 
     System.out.println("Main thread exiting."); 
    } 
} 

здесь вы можете удалить метод синхронизированного justCall(), и вы можете инициализировать блок синхронизации в пробеге() метод (поместить justCall (код) методы в синхронизированном блоке).

Как синхронизировать детский код здесь? Пожалуйста помоги. Я прочитал, что метод Thread.sleep() никогда не освобождает блокировку во время ее выполнения в блоке или методе синхронизации. Но в моем коде основной поток и дочерний код выполняются одновременно. Пожалуйста, помогите синхронизировать дочерний код с помощью метода Thread.sleep().

ответ

2

Когда два потока синхронизируются на одном и том же объекте, они не будут запускать тот же самый код. Это позволяет много разных потоков взаимодействовать во многих разных областях кода одновременно.

A synchronized по нестационарному методу создает блокировку объекта this. Если бы это был статический метод, блокировка была бы на объекте Class для класса NewThread. Любой класс и любой экземпляр любого класса могут иметь на нем syncronized и тем самым создавать блокировку.

В синхронизированной области имеется только один поток. Таким образом, хотя он заблокирован, ни один другой поток не пытается запустить заблокированный код. Ни один другой поток не пытается синхронизировать экземпляр nt класса NewThread.

Вы можете попробовать сделать это:

NewThread nt1 = new NewThread();   // create a new thread 
NewThread nt2 = new NewThread();   // create a 2nd new thread 

Тогда оставь зацикливание в главном классе.

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