如何处理java线程

如何处理java线程,java,multithreading,Java,Multithreading,我有一个叫做communicator的类。此类是从另一个程序接收事件的线程的侦听器。这个类还有一个方法调用refresh,该方法调用refresh向程序发送和操作a,以等待通过侦听器得到的响应 这两个方法在同一个类中,但由不同的线程调用 public void processRefreshEvent(ManagerEvent event){ //processing event //... //I'm done notify(); } public synch

我有一个叫做communicator的类。此类是从另一个程序接收事件的线程的侦听器。这个类还有一个方法调用refresh,该方法调用refresh向程序发送和操作a,以等待通过侦听器得到的响应

这两个方法在同一个类中,但由不同的线程调用

public void processRefreshEvent(ManagerEvent event){
    //processing event
    //...
    //I'm done
    notify();
}


public synchronized void refresh() throws Exception {
    isRefreshing = true;    
    try {
                    manager.send(new refresh());
    } catch (ManagerException e) {
        isRefreshing = false;
    }

    try {
            wait(5000);
    } catch (InterruptedException e) {
    } finally{
        isRefreshing = false;
    }
}
在执行上述代码时,我得到以下异常:


“等待”另一个线程完成的正确方式是什么。谢谢。

您需要在监视器上同步线程。例如(使用当前对象作为监视器):


您需要在监视器上同步线程。例如(使用当前对象作为监视器):

Object.wait()
的JavaDocs: “当前线程必须拥有此对象的监视器。” 因此,您需要在正在调用的对象上同步等待

或者,您可以使用
阻塞队列
,它实现
收集
队列
BlockingQueue
完成等待和通知的所有工作。您的线程可以只调用
take()
,它将阻塞,直到数据可用为止。您可以使用各种插入方法(add、put等)将数据添加到队列中。顺便说一句,insert方法调用
notify
,而
take()
调用
wait
Object.wait()
的JavaDocs: “当前线程必须拥有此对象的监视器。” 因此,您需要在正在调用的对象上同步等待

或者,您可以使用
阻塞队列
,它实现
收集
队列
BlockingQueue
完成等待和通知的所有工作。您的线程可以只调用
take()
,它将阻塞,直到数据可用为止。您可以使用各种插入方法(add、put等)将数据添加到队列中。顺便说一句,insert方法调用
notify
,而
take()
调用
wait
方法,并且只能从当前在其实例上同步的线程调用

声明“processRefreshEvent”
synchronized
,或者更确切地说,只声明修改
refresh
方法使用的状态的代码块,以及
notify()
调用

public void processRefreshEvent(ManagerEvent event){
  // processing event
  synchronized (this) {
    // modify shared state with results of processing.
    notify();
  }
}
方法和只能从当前在其实例上同步的线程调用

声明“processRefreshEvent”
synchronized
,或者更确切地说,只声明修改
refresh
方法使用的状态的代码块,以及
notify()
调用

public void processRefreshEvent(ManagerEvent event){
  // processing event
  synchronized (this) {
    // modify shared state with results of processing.
    notify();
  }
}

请阅读和上的JavaDoc

您应该将wait()与适当的监视器同步,在这种情况下:

try{
    synchronized(this){
          wait(5000);
    }
}
catch (InterruptedException e) {
} finally{
            isRefreshing = false;
}

请阅读和上的JavaDoc

您应该将wait()与适当的监视器同步,在这种情况下:

try{
    synchronized(this){
          wait(5000);
    }
}
catch (InterruptedException e) {
} finally{
            isRefreshing = false;
}

你说你想等到另一个线程完成?然后对要等待的线程对象调用join()?然后对要等待的线程对象调用join()。

为了清楚起见,“任何线程”表示“任何一个等待线程”,而不是“所有等待线程”。还要注意,等待线程可能会自动唤醒。为了清楚起见,“任何线程”表示“任何一个等待线程”,而不是“所有等待线程”。还要注意,等待的线程可能会自动唤醒。