gpt4 book ai didi

java - 线程中的 IllegalMonitorStateException

转载 作者:行者123 更新时间:2023-12-01 13:20:29 24 4
gpt4 key购买 nike

我想在线程中运行的 Vector 中使用同步

我尝试使用两种方法,一种用于等待,另一种用于通知

我想从静态类调用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);
}

但是我有这个异常(exception),我尝试运行

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)

最佳答案

您正在调用

this.File_Message.wait();

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

对我来说,为什么要尝试在该对象上调用 wait() 并不明显,但如果您想这样做,那么您需要在此时拥有其监视器。

浏览tutorial on synchronized methods以及 Object#wait() 的 javadoc .

关于java - 线程中的 IllegalMonitorStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22057465/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com