如何在java

时间:2016-07-07 15:19:37

标签: java multithreading

在下面的代码我的应用程序运行可能会线程。但是我如何通知某些线程。 当字符串 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

提前感谢您提供的任何帮助。

1 个答案:

答案 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();
} 

我不知道这是一场正确的战争还是没有。如果错误提供有效的方法。