当前位置: 技术问答>java相关
子线程如何将运算结果返回给调用方
来源: 互联网 发布时间:2015-07-11
本文导语: 兄弟我在一个程序中,定义了子线程,然后在主线程中建立子线程 subthread。 并通过类的初始化,将参数传递给子线程,让其运算,并将运算结果保留在一个类的变量result中。现在遇到一个问题:主线程如何能够在子...
兄弟我在一个程序中,定义了子线程,然后在主线程中建立子线程 subthread。
并通过类的初始化,将参数传递给子线程,让其运算,并将运算结果保留在一个类的变量result中。现在遇到一个问题:主线程如何能够在子线程结束的时候自动获得运算结果。主要是我搞不清何时该读subthread.result,读的早了运算还没有完成,值是空的。
我已经尝试使用在子线程中做标志位,方法算然可行,但如果子线程运算时间较长,主程序因为要不停的检查标志位,就如同死机一般。很不好。
诸位大侠,有没有好一些的办法。使得子线程在运算结束的时候可以将结果传递回来。
并通过类的初始化,将参数传递给子线程,让其运算,并将运算结果保留在一个类的变量result中。现在遇到一个问题:主线程如何能够在子线程结束的时候自动获得运算结果。主要是我搞不清何时该读subthread.result,读的早了运算还没有完成,值是空的。
我已经尝试使用在子线程中做标志位,方法算然可行,但如果子线程运算时间较长,主程序因为要不停的检查标志位,就如同死机一般。很不好。
诸位大侠,有没有好一些的办法。使得子线程在运算结束的时候可以将结果传递回来。
|
你可以做一个Notify接口,在该接口方法中对结果作处理。然后你的主线程实现该接口,并在子线程构造的时候传递给他,当子线程做完运算后调用该方法就可以了。注意该方法需要同步,如果你又多个子线程。
public interface Notify{
public void perform(result);
}
public class MainThread implements Notify{
public synchronized void perform(result){
System.out.print(result);
}
public void doCal(){
new SubThread(this).start();
}
}
public class SubThread extends Thread{
private Notify notify;
public SubThread(Notify notify){
this.notify = notify;
}
public void run(){
.....
notify.perform(result);
}
}
public interface Notify{
public void perform(result);
}
public class MainThread implements Notify{
public synchronized void perform(result){
System.out.print(result);
}
public void doCal(){
new SubThread(this).start();
}
}
public class SubThread extends Thread{
private Notify notify;
public SubThread(Notify notify){
this.notify = notify;
}
public void run(){
.....
notify.perform(result);
}
}
|
在主线程中加入下段代码:
ServerSocket serverSocket = new ServerSocket(监听的端口号);
Socket socket = serverSocket.accept();
DataInputStream is = new DataInputStream(socket.getInputStream());
if(is.readUTF().equals("end")){
Object result = subthread.result;
}
在子线程中加入下面代码:
Socket s = new Socket("localhost", port);
DataOutputStream os = new DataOutputStream(s.getOutputStream());
os.writeUTF("end");
ServerSocket serverSocket = new ServerSocket(监听的端口号);
Socket socket = serverSocket.accept();
DataInputStream is = new DataInputStream(socket.getInputStream());
if(is.readUTF().equals("end")){
Object result = subthread.result;
}
在子线程中加入下面代码:
Socket s = new Socket("localhost", port);
DataOutputStream os = new DataOutputStream(s.getOutputStream());
os.writeUTF("end");
|
主程序用一boolean量canceled控制子线程
在子线程运行过程中检测这个变量,若为true则停止子线程运行.
子线程运行完毕后,加一调用:
... //子线程的运算,若有
//循环就可用
//canceled判定结束
SwingUtilities.invokeLater(new Runnable(){ //交给事件派发线程,
public void run() //待会调用.
{
if (!canceled)
{
//运行完毕的处理代码
}
}
});
} //子线程可以结束了
主线程在适当时机将canceled 置为true.
在子线程运行过程中检测这个变量,若为true则停止子线程运行.
子线程运行完毕后,加一调用:
... //子线程的运算,若有
//循环就可用
//canceled判定结束
SwingUtilities.invokeLater(new Runnable(){ //交给事件派发线程,
public void run() //待会调用.
{
if (!canceled)
{
//运行完毕的处理代码
}
}
});
} //子线程可以结束了
主线程在适当时机将canceled 置为true.
|
你的问题还是不清楚.
在主线程必须要子线程的值的时候,
... //主线程的代码
subthread.join(); //等待子线程执行完毕
... //好了,此时应可以取得运算结果了
在主线程必须要子线程的值的时候,
... //主线程的代码
subthread.join(); //等待子线程执行完毕
... //好了,此时应可以取得运算结果了
|
如果主线程调用子线程以后没有等待,那么最简单的办法是使用回掉函数。
把主线程所在的类,作为参数传给子线程,这个类里做一个函数处理子线程的回调。这样,子线程运算完以后,调用回调函数,就把值传给了主线程,并使主线程继续执行。
也可以把回调函数做成一个接口,让主线程所在的类实现它。
这样做占用的资源很少,并且很容易实现。
把主线程所在的类,作为参数传给子线程,这个类里做一个函数处理子线程的回调。这样,子线程运算完以后,调用回调函数,就把值传给了主线程,并使主线程继续执行。
也可以把回调函数做成一个接口,让主线程所在的类实现它。
这样做占用的资源很少,并且很容易实现。
|
请问你想让程序
1.必须得到子程序的值的时候,不得到值无法执行
2.不等待
的状态下,主程序做什么?
join()只是确保计算完成
1.必须得到子程序的值的时候,不得到值无法执行
2.不等待
的状态下,主程序做什么?
join()只是确保计算完成