swing与并发【工作线程】【拥有临时结果的任务】

就是工作线程在后台运行到半拉,给出一个临时数据信息,也就是说临时的结果


方法就是在工作线程中使用publish()方法将中间数据存入其中,再覆盖process方法,存入的中间数据将被他调到事件分派线程来

//这段代码主要是为读者展示如何处理正在运行的程序的中间结果
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.SwingUtilities;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingWorker;
public class threadtest
{
static final int WIDTH=600;
static final int HEIGHT=800;
JFrame frame;
JPanel pane;
static JTextField text1;
private worker wor1;
private worker wor2;
public void add(Component c,GridBagConstraints constraints,int x,int y,int w,int h)
{
constraints.gridx=x;
constraints.gridy=y;
constraints.gridwidth=w;
constraints.gridheight=h;
pane.add(c,constraints);
}
public threadtest()
{
frame=new JFrame("中间结果任务测试");
pane=new JPanel();
frame.setContentPane(pane);
Toolkit kit=Toolkit.getDefaultToolkit();
Dimension screenSize=kit.getScreenSize();
int width=screenSize.width;
int height=screenSize.height;
int x=(width-WIDTH)/2;
int y=(height-HEIGHT)/2;
frame.setSize(WIDTH,HEIGHT);
frame.setLocation(x,y);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.pack();
GridBagLayout layout=new GridBagLayout();
pane.setLayout(layout);
GridBagConstraints constraints=new GridBagConstraints();
constraints.fill=GridBagConstraints.NONE;
constraints.anchor=GridBagConstraints.EAST;
constraints.weightx=4;
constraints.weighty=3;
JButton button1=new JButton("运行后台计数器一");
JButton button2=new JButton("运行后台计数器二");
JButton button3=new JButton("临时结果操作一");
JButton button4=new JButton("临时结果操作二");
text1=new JTextField(10);
add(button1,constraints,1,0,1,1);
add(button3,constraints,0,1,1,1);
add(text1,constraints,2,1,1,1);
add(button2,constraints,1,2,1,1);
add(button4,constraints,0,3,1,1);
button1.addActionListener
(//将计数工作放入工作线程,然后执行它
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
(wor1 = new worker()).execute();
}
}
);

button2.addActionListener
(//将计数工作放入工作线程,然后执行它
new ActionListener()
{
public void actionPerformed(ActionEvent Event)
{
(wor2 = new worker()).execute();
}
}
);

button3.addActionListener
(//当单击此按钮时,后台计数会停止,并且会将目前的数据显示在文本组件中。
new ActionListener()
{
public void actionPerformed(ActionEvent Event)
{
wor1.cancel(true);
wor1 = null;

}
}
);

button4.addActionListener
(//当单击此按钮时,后台计数会停止,并且会将目前的数据显示在文本组件中。
new ActionListener()
{
public void actionPerformed(ActionEvent Event)
{
wor2.cancel(true);
wor2 = null;
}
}
);
}

private static class counter
{//创建一个内部类,使用其构造器赋值
private final int sum;

counter(int sum)
{
this.sum=sum;
}
}

private class worker extends SwingWorker<Void, counter>
{//创建一个worker类,这个类继承SwingWorker类,所以要实现doInBackground()和process()方法。这个方法主要是实现一个计数功能
protected Void doInBackground()
{
int sum = 0;
while (!isCancelled())
{
sum++;
}
publish(new counter(sum)); //使用publish()方法将中间数据储存起来
return null;
}
protected void process(List<counter> count)
{//这个方法主要是将中间数据从publish()方法中提取出来,在放入到事件分发线程中去显示
counter cou = count.get(count.size() - 1);
text1.setText(String.format("%d", cou.sum));
}
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new threadtest();
}
});
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值