java笔记--使用SwingWoker类完成耗时操作
使用SwingWoker类完成耗时操作:
对于Swing中的耗时操作,通常要在一个新的线程中运行,以免程序"假死"。
在java6.0中,可以用SwingWoker类来完成
SwingWoker<T,V>是在专用线程中执行长时间GUI交互任务的抽象类。用Swing
编写多线程应用程序时,要记住两个约束条件:
1.不应该在事件指派线程运行耗时任务,否则应用程序将无反应。
2.只能在事件指派线程上访问Swing控件
注: 通常需要将耗时的任务放到SwingWoker类的doInBackground()方法中
执行:
protected abstract T doInBackground()throws Exception
--如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3912080.html "谢谢--
代码实例:
package com.xhj.thread; import java.awt.Button; import java.awt.Label; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Arrays; import java.util.Random; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingWorker; /** * @author XIEHEJUN * */ public class UsedSwingWokerThread extends JFrame { private Label lable; private Button button; public Label getLable() { return lable; } public void setLable(Label lable) { this.lable = lable; } public Button getButton() { return button; } public void setButton(Button button) { this.button = button; } private class NumberArrary extends SwingWorker<Void, Integer> { @Override protected Void doInBackground() throws Exception { button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int[] numArrary = new int[1000]; for (int i = 0; i < 1000; i++) { numArrary[i] = new Random().nextInt(); System.out.println(i + "号数为:" + numArrary[i]); } Arrays.sort(numArrary); System.out.println("生成的最大随机数为:" + numArrary[numArrary.length - 1]); lable.setText("生成的最大随机数为:" + numArrary[numArrary.length - 1]); } }); return null; } } /** * @param args */ public static void main(String[] args) { UsedSwingWokerThread usedSwingWoker = new UsedSwingWokerThread(); JFrame frame = new JFrame(); JPanel panel = new JPanel(); frame.setContentPane(panel); frame.setVisible(true); usedSwingWoker.setLable(new Label("点击按钮生成随机数组")); usedSwingWoker.setButton(new Button("开始生成")); frame.add(usedSwingWoker.getLable()); frame.add(usedSwingWoker.getButton()); NumberArrary arrarys = usedSwingWoker.new NumberArrary(); try { arrarys.doInBackground(); } catch (Exception e) { e.printStackTrace(); } } }
注:SwingWoker的生命周期与线程
1.当前线程:在该线程上调用execute()方法。它调度SwingWoker以在worker线程上执行并立即返回,
可使用get方法等待SwingWoker完成。
2.Worker线程:在该线程上调用doInBackground()方法。所有后台活动都应该在此线程上发生。
要通知PropertyChangListeners有关绑定(bound)属性的更改,请使用firePropertyChang
和getPropertyChangeSupport()方法、默认情况下,有两个可用的绑定属性,即state和progress
3.事件指派线程:所有与Swing有关的活动都在该线程上发生。SwingWoker调用process和done()方法,
并通知该线程的所有PropertyChangListener。