如何处理java线程
我有一个叫做communicator的类。此类是从另一个程序接收事件的线程的侦听器。这个类还有一个方法调用refresh,该方法调用refresh向程序发送和操作a,以等待通过侦听器得到的响应 这两个方法在同一个类中,但由不同的线程调用如何处理java线程,java,multithreading,Java,Multithreading,我有一个叫做communicator的类。此类是从另一个程序接收事件的线程的侦听器。这个类还有一个方法调用refresh,该方法调用refresh向程序发送和操作a,以等待通过侦听器得到的响应 这两个方法在同一个类中,但由不同的线程调用 public void processRefreshEvent(ManagerEvent event){ //processing event //... //I'm done notify(); } public synch
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()。为了清楚起见,“任何线程”表示“任何一个等待线程”,而不是“所有等待线程”。还要注意,等待线程可能会自动唤醒。为了清楚起见,“任何线程”表示“任何一个等待线程”,而不是“所有等待线程”。还要注意,等待的线程可能会自动唤醒。