2014-03-05 82 views
0

我有两个Java类无法在线程中运行wait()方法?

public class Firstclass 
{ 
    public static void main(String args[]) throws InterruptedException 
    { 
     System.out.println("Main start...."); 
     Secondclass s=new Secondclass(); 

     Thread t1 = new Thread(s); 
     t1.setName("First Thread"); 

     Thread t2=new Thread(s); 
     t2.setName("Second Thread"); 

     t1.start(); 

     t2.start(); 
     System.out.println("Main close...");   
    } 
} 

public class Secondclass implements Runnable 
{ 
    public static Object obj; 

    int counter=10; 

    public void inc() 
    { 
     counter++; 
    } 

    public void dec() 
    { 
     counter--; 
    } 

    @Override 
    public void run() 
    { 
     try 
     { 
      loop(); 
     } 
     catch(Exception e) 
     { 
      System.out.println("exception is"+e); 
     } 
    } 

    public void loop() throws InterruptedException 
    { 
     for(int i=0;i<10;i++) 
     {    
      if(Thread.currentThread().getName().equals("First Thread")) 
      { 
       Thread.currentThread().wait(); 
       inc();     
      } 
      else 
      { 
       dec(); 
      } 
      System.out.println("Counter=="+counter); 
     } 
    } 
} 

我的第一个问题是:我想我的第一个线程等待,直到第二个线程完成,我能够acheive这一点,但在输出我得到例外java.lang.IllegalMonitorStateException。我不知道为什么。

我的第二个问题是:你能指导我任何教程网站,我可以从基础学习等待(),通知和notifyall()方法。

+0

你是否已经开始阅读'wait()'方法的javadoc? –

+0

@ Sotirios是的,但我一直在寻找一个实用的简单例子。 – TruePS

+2

忘掉这个例子。了解它的作用。读完javadoc后,您应该确切知道抛出异常的原因。 –

回答

2

答1: - 你需要如下使用join()方法: -

t2.start(); 
t2.join(); 

t1.start(); 
t1.join(); 

答2: - 参见本link的等待和通知的例子。

2

我想我的第一个线程等待,直到第二线程完成,我 能够acheive这一点,但在输出我得到异常 “java.lang.IllegalMonitorStateException'.I不知道为什么。

wait()方法在Object类中声明,在Java中所有引用类型的鼻祖。因此,您可以在任何导致对象引用的表达式上调用该方法。

javadoc说以下

造成当前线程等待,直到其他线程调用 java.lang.Object.notify()方法或此对象的java.lang.Object.notifyAll() 方法。换句话说,如果该方法仅执行呼叫wait(0),则该方法的行为与 完全相同。

当前线程必须拥有该对象的监视器。线程释放该显示器并等待另一个线程的 所有权通知 线程在等待这个对象监视器上或者通过 调用notify方法或notifyAll方法来唤醒。然后线程 等待,直到它可以重新获得显示器的所有权并恢复执行 。

因此,如果你有

Thread.currentThread().wait(); 

调用它,但你从来没有同步(即得到了监控器)通过

Thread.currentThread() 

返回的对象,那么你会得到那IllegalMonitorException

作为一个附注,不要每个在Thread实例上同步。他们在生命周期结束时有一些意想不到的行为。

解决您的问题的一种方法是为Runnable实例提供共享的Object。每个人都试图围绕某个代码块同步该对象。另一个线程将不得不等待,直到第一个获取显示器的线程完成使用。

但是,不要依赖于这里的顺序。线程调度程序将决定每个线程何时运行。

你能PLZ指导我任何教程网站在那里我可以学到wait()的,从基础通知 和notifyAll的()方法。

如果您有任何问题,请直接拨打电话java <the thing you want>。在这种情况下,您需要查看Javadoc和Concurrency tutorials