在下面的代码我的应用程序运行可能会线程。但是我如何通知某些线程。
当字符串 msg
更改时,我的任务是打印来自服务器对象 msg
字符串的所有线程。
class Server{
static String msg;
synchronized void setMsg(String msg){
this.msg = msg ;
notifyAll();
}
synchronized void proccess(){
while(true){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" : "+Server.msg);
}
}
}
这是我的主题类:
class MyThread extends Thread {
Server ser ;
public MyThread(Server ser) {
this.ser = ser ;
this.start();
}
public void run() {
ser.proccess();
}
}
Main Meth():
class Thread_test {
static String[] name = null ;
public static void main(String[] args) throws InterruptedException {
Server ser = new Server();
for (int i = 0 ; i < 5 ; i++){
MyThread t1 = new MyThread(ser);
t1.setName("Thread "+i);
}
while(true){
Thread.sleep(5000);
ser.sendMsg("Msg : current time is = " + System.currentTimeMillis());
}
}
我每5秒更改一次Server消息字符串。更改消息时,我调用 notifyAll()。这个notifyall是唤醒所有等待的线程。但我想要的是:我创建10个线程和setName Thread_1 Thread_2 ..等等。现在我想通知一些线程,如Thread_1,Thread_4和Thread_9。我尝试下面的func
while(true){
Thread.sleep(5000);
ser.sendMsg("Msg : current time is = " + System.currentTimeMillis());
for ( Thread t : Thread.getAllStackTraces().keySet() ){
if(t.getName().equals("Thread_1") || t.getName().equals("Thread_4") || t.getName().equals("Thread_9")){
t.notify();
}
}
}
我得到了 Exception in thread "main" java.lang.IllegalMonitorStateException
提前感谢您提供的任何帮助。
答案 0 :(得分:0)
class Server{
String msg;
void sendMsg(String msg){
this.msg = msg ;
}
public void proccess() throws InterruptedException{
while(true){
synchronized (Thread.currentThread()) {
Thread.currentThread().wait();
}
System.out.println(Thread.currentThread().getName()+" : "+this.msg);
}
}
}
删除班级对象 wait()
并添加 Thread.wait()
并添加
synchronized(t){
t.notify();
}
我不知道这是一场正确的战争还是没有。如果错误提供有效的方法。