注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Search的博客

不断学习中!

 
 
 

日志

 
 

父进程与子线程之间通信  

2014-03-13 22:51:37|  分类: |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
线程的使用主要适用于以下这几种情况:
 1.需要执行耗时的操作,这时为了使在执行耗时操作的同时能够很好的响应用户的操作,提升用户体验,这时需要将耗时操作
    放到线程中执行。
2.如果硬件中有多个CPU,这时为了提高硬件的利用效率,这时可以引入线程。
3.并行操作时满足多用户的并发请求,例如常见的C/S访问

我们知道,线程之间有线程管理器来调节,当线程已经执行了很长时间仍然没有结束时,线程会自动调用yield方法将cpu时钟让给其他线程,也就是线程间的协作机制。那么怎么使进程与其子线程之间通信呢,也就是考虑一个很简单的问题,在一个窗体程序中,如果我们需要为程序的执行准备数据,在数据尚未准备完成时我们使一个button按钮设置为disable,当数据准备完成以后我们需要通知进程,以便父进程更新响应状态。
 为了实现上述操作我们一般可以采取两种思路,一种是将父进程的句柄传递给子线程,当子线程执行完毕以后通过父进程句柄调用相关函数来更新状态。

package code.lxy.test;

import java.util.concurrent.Callable;


public class SonThread implements Callable<Integer> {

/**
* @param args
*/
@Override
public Integer call() {
// TODO Auto-generated method stub
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return 1;
}
}



另一种思路是在函数执行完毕以后,形成类似于回调函数机制来实现,在java中是使用Callable和FutureTask来配合使用的。
相比于Runnable,Callable的一大特点时我们可以获取函数执行以后的返回值(不过感觉通过进程函数句柄将执行结果赋给某个变量也可以)。

package code.lxy.test;

import java.util.concurrent.Callable;


public class SonThread implements Callable<Integer> {

/**
* @param args
*/
@Override
public Integer call() {
// TODO Auto-generated method stub
//模拟耗时操作
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return 1;
}
}



package code.lxy.test;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.FutureTask;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;


public class MainThread extends JFrame{

/**
*
*/
private static final long serialVersionUID = 1L;
private JLabel myLabel;
private JButton myButton;
public MainThread()
{
myLabel=new JLabel("正在准备数据");
myButton=new JButton("click me");
myButton.setEnabled(false);
this.add(myLabel,BorderLayout.SOUTH);
this.add(myButton,BorderLayout.CENTER);
myButton.addActionListener(new MyButtonClickHandler());
this.setSize(new Dimension(400,300));
this.setVisible(true);
}
public void setText(String text)
{
this.myLabel.setText(text);
}
public static void main(String[] args) {
final MainThread mainThread=new MainThread();
FutureTask<Integer> future=new FutureTask<Integer>(new SonThread())
{

@Override
protected void done() {
// TODO Auto-generated method stub
mainThread.myButton.setEnabled(true);
mainThread.myLabel.setText("数据准备完成");
}
};
new Thread(future).start();
System.out.println("hello world");
}
class MyButtonClickHandler implements ActionListener
{

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
JOptionPane.showMessageDialog(null, "click event toggled");
}

}
}



  评论这张
 
阅读(415)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017