问题:主线程当启动子线程后,需要子线程执行完毕的结果,在子线程执行过程中主线程是不做任何操作的。我想到用wait()和notify()方法,但是主类中调用Thread.currentThread().wait();总报异常java.lang.IllegalMonitorStateException而且也没有在子线程执行完后继续执行。
子线程这么写的:在run方法最后一句Thread.currentThread().notify();另外请问join的作用,谢谢
子线程这么写的:在run方法最后一句Thread.currentThread().notify();另外请问join的作用,谢谢
解决方案 »
- 我是菜鸟!麻烦java高手们指教!!!
- 怎么批量执行SQL语句?
- 遇到下面一个错误已经找了一天了,希望各位大侠能帮到我
- 为什么我输入http://localhost:8080就会自动跳转到http://www.localhost.com
- 有没有可能在同一SESSON内把一个页面在两个IE窗口显示,就是说一个页面没关掉,又新弄出一个,但又在同一SESSON内
- 各位大师,帮忙解决几个java问题!感激不尽!十万火急!!!!
- <meta http-equiv="Cache-Control" CONTENT="no-cache">是干啥的?
- JBuider在win2000Server配置?
- jsp中关于ResultSet的问题?
- 关于在linux中tomcat启不来的问题,请各位大哥赐教?
- JSP文件里有java代码和javascript代码, 如何在java代码内引用javascript里的变量?
- [100高分求解]解析简单的XML
主线程操作....
1.在子线程中设置状态变量,在run()第一行设置为running,得到结果后设置为finish。主线程定时去查询子线程的状态
当为finish时就去取结果,这样方法比较简单。但是是笨方法,主线程的查询可以认为是空耗资源。2.让主线程和子线程共享一个对象(多线程时,可以是一个该对象类型的集合),当主线程启动子线程后,
就开始取结果,当共享对象为空时,主线程进入等待状态,子线程完成后,把结果添加到共享对象中,之后唤醒主线程。
这样的方法比较好。这样方法最难的部分在于对哪个对象进行加锁,正确的方法应该是锁共享对象,而不是锁主线程或子线程。附个简单例子:(临时写的可能有问题)public class ParentThread extends Thread{
public static LinkedList<Result> resultList= new LinkedList<Result>();
@Override
public void run(){
ChildThread thread = new ChildThread();
thread.start();
Result result = getResult();
.......//你处理结果的代码
} private Result getResult(){
Result result = null;
synchronized(resultList){
while(resultList.isEmpty()){
try {
resultList.wait();
} catch (InterruptedException e) {}
}
result = resultList.poll();
}
return result;
}
}
public class ChildThread extends Thread{
private LinkedList<Result> resultList = ParentThread.resultList;
@Override
public void run(){
Result result = .....//你自己处理过程
putResult(result);
} private void putResult(Result result){
synchronized(resultList){
resultList.add(result);
resultList.notifyAll();
}
}
}写完发现竟然写了半小时。
java.util.concurrent
中的Future能解决你的问题吗