2013-04-02 51 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​​在非静态方法上创建对象this上的锁。如果它是一种静态方法,则该锁应该在NewThread类的Class对象上。任何类和任何类的任何实例都可以有一个syncronized,从而创建一个锁。

您只有一个线程在同步区域中运行。所以,当它被锁定时,其他线程不会尝试运行锁定的代码。没有其他线程试图在NewThread类的nt实例上同步。

你可能想尝试这样做:

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

然后离开关循环的主类。