线程中的IllegalMonitorStateException

时间:2014-02-27 01:49:24

标签: java wait synchronized

我想在线程

中的Vector运行中使用synchronized

我试着将一种方法用于等待而另一种用于非法

我想从静态类调用notify方法 这是我的线程代码:

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
import java.util.Vector;


public class TSend extends Thread {

     Vector<String> File_Message=new Vector<String>();


        public void save_out_putMessage(String out_Msg){

             synchronized(this.File_Message){
       this.File_Message.add(out_Msg);
       this.File_Message.notify();

        }

        }


public synchronized String GetMessage() throws InterruptedException{
        String message;
        while(File_Message.size()==0){
            this.File_Message.wait();
        }

         message = File_Message.get(0);
        File_Message.removeElementAt(0);
        return message;
}


public  synchronized void Recepteur_de_Message (String message){

    /*
     * Pour savgarde tout les message des client dans un vecteur Message . 
     * 
      */
    File_Message.add(message);

    notify();

}


@Override
public void run(){
    try{
          String Message ;
          while(true){
                str =GetMessage();  
          }
    }catch(Exception e){
          e.printStackTrace();
    }

我尝试这样做:

 synchronized(F){
     while(F.size()==0) {
         F.wait();
     }

     Message= new String(F.get(0));
     F.removeElementAt(0);
 }  

但我有这个感觉,我试图运行

java.lang.IllegalMonitorStateException
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:485)
    at TSend.GetMessage(TSend.java:39)
    at TSend.run(TSend.java:78)

1 个答案:

答案 0 :(得分:1)

您正在致电

this.File_Message.wait();

在某个没有所引用对象的监视器的线程中。您可以使用synchronized方法执行此操作。在synchronized方法中,监视器是在this对象上获取的。

对我来说,为什么你试图在该对象上调用wait()并不明显,但如果你想这样做,你需要拥有它的监视器。

浏览tutorial on synchronized methodsObject#wait()的javadoc。