java学习之浅谈多线程4--SwingWorker

使用SwingWorker类优化耗时操作 为了解决这个问题,Java提供了SwingWorker类,它可以帮助我们在后台线程中执行耗时操作,从而保持用户界面的流畅性。首先,我们需要创建一个继承自SwingWorker类的子类,该子类将负责执行我们的耗时操作。SwingWorker类是javax.swing包中的一个抽象类,它提供了一个方便的方式来执行后台任务,并在任务执行完成后更新用户界面。总之,SwingWorker类是一个非常实用的工具,在开发Java应用程序时可以帮助我们优化耗时操作,提升用户体验。使用SwingWorker类优化耗时操作。 阅读详情

GUI事件处理和绘图代码在一个被称为事件分发线程的特殊线程中执行。如果一个事件需要很长的时间处理,线程就不能顾及到队列中的其他任务。为了解决这个问题,可以运行费时的任务来处理单独线程中的事件。SwingWorker是一个实现Runnable的抽象类,可以定义一个任务来扩展SwingWorker,使用任务产生的结果来运行费时的任务并更新GUI。

#doInBackground():T                     //执行任务并返回T类型的结果
#done():void                            //结束doInBackground之后执行事件分发线程

+execute():void                         //安排这个SwingWorker来执行工作线程
+get():T                                //如果有必要则等待计算完成,然后获取它的结果(即doInBackground返回的结果)

+isDone():boolean                       //如果任务完成则返回true
+cancle():beelean                       //取消任务
#publish(data v...):void                //发送process方法要处理的数据。这个方法用于从doInBackground中传送之间结果,
                                        //以处理process方法中的事件分发线程。注意,v...表示变种参数

#process(data:java.util.List<V>):void   //异步地接受事件分发线程上来自publish方法的数据

#setProgress(progress:int):void         //设置进展约束属性。这个值应该从0到100
#getProgress():void                     //返回进展约束属性

SwingWorker有两个参数即SwingWorker< T,V>,T是doInBackground和get方法的返回类型;V是publish和process方法要处理的数据类型

完成后台线程的计算可能需要很长的时间,最好能通知用户计算的进度,可以使用JProgressBar来显示进度。考虑例子:让用户指定素数的个数n,并显示从2开始的前n个素数。代码如下:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingWorker;

public class ProgressBarDemo extends JApplet {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private JProgressBar jpb = new JProgressBar();                      //定义一个进度条显示进度
    private JTextArea jtaResult = new JTextArea();                      //定义一个文本域显示素数
    private JTextField jtfPrimeCount = new JTextField(8);               //定义一个文本框用于用户填写素数个数
    private JButton jbtnDisplayPrime = new JButton("Display Prime");    //定义一个按钮执行任务

    public ProgressBarDemo() {
        jpb.setStringPainted(true);     //设置显示进度的百分比
        jpb.setValue(0);
        jpb.setMaximum(100);

        //设置文本域自动换行,并且断行不断字
        jtaResult.setWrapStyleWord(true);
        jtaResult.setLineWrap(true);

        JPanel panel = new JPanel();
        panel.add(new JLabel("Enter the prime number count"));
        panel.add(jtfPrimeCount);
        panel.add(jbtnDisplayPrime);

        add(jpb, BorderLayout.NORTH);
        add(new JScrollPane(jtaResult), BorderLayout.CENTER);
        add(panel, BorderLayout.SOUTH);

        jbtnDisplayPrime.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                ComputePrime task = 
                        new ComputePrime(Integer.parseInt(jtfPrimeCount.getText()), jtaResult);

                task.addPropertyChangeListener(new PropertyChangeListener() {

                    @Override
                    public void propertyChange(PropertyChangeEvent evt) {
                        //判断改变的属性是否是进度,如果是则获取进度的值并显示在进度条上
                        if("progress".equals(evt.getPropertyName())) {
                            jpb.setValue((Integer)evt.getNewValue());
                        }
                    }
                });

                task.execute();     //执行
            }
        });
    }

    static class ComputePrime extends SwingWorker<Integer, Integer> {

        private int count;
        private JTextArea result;

        public ComputePrime(int count, JTextArea result) {
            this.count = count;
            this.result = result;
        }

        @Override
        protected Integer doInBackground() throws Exception {
            publishPrimeNumbers(count);
            return 0;
        }

        //把找到的素数全部显示出来
        @Override
        protected void process(List<Integer> list) {
            for(int i=0; i<list.size(); i++) {
                result.append(list.get(i) + " ");
            }
            super.process(list);
        }

        private void publishPrimeNumbers(int n) {
            int count = 0;
            int number = 2;

            while(count <= n) {
                if(isPrime(number)) {
                    count ++;
                    setProgress(100 * count / n);   //设置进度
                    publish(number);                //通过publish方法将找到的素数number发送给process方法
                }

                number ++;
            }
        }

        public static boolean isPrime(int number) {
            for(int divisor = 2; divisor <= number / 2; divisor++) {
                if(number % divisor == 0) {
                    return false;
                }
            }

            return true;
        }

    }

}

注:doInBackground方法作为任务线程的一部分执行,它负责完成线程的基本任务,并以返回值来作为线程的执行结果。继承类须覆盖该方法并确保包含或代理任务线程的基本任务。不要直接调用该方法,应使用任务对象的execute方法来调度执行。

当从任务线程调用publish方法时,SwingWorker类调度process方法,如果SwingWorker通过publish发布了一些数据,那么也应该实现process方法来处理这些中间结果,任务对象的父类会在事件分发线程上激活process方法,因此在此方法中程序可以安全的更新UI组件。

无论何时调用setProgress方法,SwingWorker类都会产生一个propertyChangeEvent。setProgress方法设置一个0到100之间的新的进度值,这个值包装在PropertyChangeEvent中,这个事件的监听器使用getNewValue()方法获取进度值。

程序执行结果如下:
糟糕,图片不见了>.<

91、Java并发编程:并发集合与SwingWorker的应用 本文介绍了Java并发编程中的并发集合与SwingWorker的应用。并发集合如ConcurrentHashMap和ArrayBlockingQueue等,为多线程环境下的数据共享提供了高效且线程安全的解决方案。SwingWorker则用于Swing GUI应用中处理长时间计算任务,通过工作线程执行耗时操作并在事件调度线程更新界面,提高了应用的响应性和用户体验。文章通过斐波那契数列计算和埃拉托斯特尼筛法两个示例,详细展示了SwingWorker在处理并发任务和更新GUI方面的强大功能。 阅读详情

相关推荐

Swing线程的深入理解和SwingWorker基础知识介绍

Swing线程的深入理解和SwingWorker基础知识介绍

【Java线程】SwingWorker的用法

Swing应用程序员常见的错误是误用Swing事件调度线程(Event DispatchThread,EDT)。他们要么从非UI线程访问UI组件;要么不考虑事件执行顺序;要么不使用独立任务线程而在EDT线程上执行耗时任务,结果使编写的应用程序变得响应迟钝、速度很慢。耗时计算和输入/输出(IO)密集型任务不应放在SwingEDT上运行。发现这种问题的代码并不容易,但Java SE6提供了java

Alpha's 学习笔记 4万+

Java的Swing编程中使用SwingWorker线程模式及顶层容器

主要介绍了在Java的Swing编程中使用SwingWorker线程模式及顶层容器的方法,适用于客户端图形化界面软件的开发,需要的朋友可以参考下

Swing使用SwingWorker执行多线程异步任务

参考文章:swingworker_使用SwingWorker的Java Swing中的多线程 使用SwingWorker为界面执行异步任务 SwingWorkerDemo.java package org.fiend.swing.test.demo.swingworker.test; import javax.swing.*; import java.awt.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyCh

justlpf的专栏 2319

tcllib2.0 package - csv

tcl lib 的csv库

shin 859

三维重建Fusion中的TSDF算法通俗描述

看个视频 https://www.youtube.com/watch?v=8M_-lSYqACo 这是mobilefusion的视频,大家先了解一下,看到在三维重建的时候外面有个长方体包围盒了吗? 数据准备: 我们不同角度拍摄的RGB图、深度图和相应的pose.txt。 步骤: 1.建立长方体包围盒 要建立一个长方体包围盒。让所有的三维点都在这个长方体里面。 假设z方向垂直相机。 很明显,x,y方...

qq_30339595的博客 1万+

java:使用SwingWorker类完成耗时操作(附带源码)

java:使用SwingWorker类完成耗时操作(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1113

告别JTAG!用Artix-7和SPI Flash实现FPGA远程升级的保姆级教程

本文详细介绍了如何利用Artix-7 FPGA和SPI Flash实现FPGA远程升级(OTA)的完整方案。通过硬件连接、Vivado工程配置和STM32模拟更新等步骤,帮助开发者告别传统的JTAG烧录方式,实现高效、安全的远程固件更新,特别适用于嵌入式系统开发中的现场维护场景。

weixin_33964987的博客 364

swingworker笔记

swingworker使用说明1、创建swingworker实例,并在构造函数中引入任务执行的必要参数    PrimeNumbersTask task = new PrimeNumbersTask(textArea, otherParam);        textArea    用来显示动态的处理结果    otherParam    其他参数,比如要获取一万个素数,就输入10000 

1439

【NLP】语言模型的发展历程 (1)

N-gram模型是一种基于统计语言模型的文本分析算法,它用于预测文本中下一个词出现的概率,基于前面出现的n-1个词的序列。这里的n代表序列中元素的数量,因此称为N-gram。Unigram:N=1,每个单词的出现概率独立计算,不考虑上下文。Bigram:N=2,基于前一个单词预测当前单词的联合概率模型。Trigram:N=3,考虑前两个单词来预测当前单词的联合概率模型,更复杂但可能更准确。

酒酿小圆子呀~ 1668

C#实现跨域访问共享文件夹的账号密码验证方案

本文详细介绍了在C#中实现跨域访问共享文件夹的账号密码验证方案。通过调用Windows API LogonUser函数,结合LOGON32_LOGON_NEW_CREDENTIALS登录类型,可安全模拟指定用户身份,有效解决工作组与域环境间的文件共享访问难题。文章提供了完整的工具类封装、多种实战场景示例及详细的错误排查指南。

pea55的博客 539

java 简单示例关于swingworker

今天看来一点java的swingworker难怪我之前写的界面加线程不起作用。当java中界面有涉及到线程,且线程可能会对流进行处理,这个时候用swingworker最好不过了。 我将书上的代码记录下来。也算练习了一遍 /**  * author:zr  * date:2013/4/17  * Frame has a text area to show the contents of a

rudy45的专栏 986

Kalibr标定避坑指南:如何用AprilGrid板快速完成双目IMU标定

本文详细介绍了使用AprilGrid板进行Kalibr双目IMU联合标定的实战技巧,包括标定工具选型、数据采集优化、标定流程及结果验证。通过AprilGrid板的唯一标识性和抗遮挡优势,结合IMU静止标定和运动激励设计,显著提升标定精度。文章还提供了常见报错处理和高级优化技巧,帮助开发者高效完成传感器标定。

sunny的博客 282

使用SwingWorker之一

<br />复习java知识时,无意中看到SwingWorker,以前从来不知道还有这个类,发现自己以前对EDT的认识上有很多错误,看到了这篇文章,写的很详细,转载一下。链接:http://blog.sina.com.cn/s/blog_4b6047bc010007so.html正确理解和使用Swing线程模型编程是编写响应灵活的Swing程序的关键。从Java SE 6开始引进的SwingWorker能帮你轻松的编写多线程Swing程序,改善你Swing程序的结构,提高界面响应的灵活性。SDN(Sun d

zhuxiufenghust的专栏 898

EMC基础知识总结

电磁干扰(Electromagnetic Interference),简称EMI,有和两种。传导干扰主要是电子设备产生的干扰信号通过导电介质或公共电源线互相产生干扰;辐射干扰是指电子设备产生的干扰信号通过空间耦合把干扰信号传给另一个电网络或电子设备。

学海无涯的专栏 1367

2023年GESP12月认证C++五级真题解析

例如,如果a=4,那么4是最⼩的幸运数,而1不是,但我们可以连续对1做3次+1操作,使其变为4,所以我们可以说,1幸运化后的结果是 4。【题目大意】给一个完全平方数的标准,推导出哪些是超级幸运数,然后判断N个数字中,哪些是超级幸运数,是的输出“lucky”,不是的输出离该数字最近的比它大的数字。前一个数字,下标是j的数字是偶数,后面的数字下标是j+1的是奇数,按照要求,偶数在奇数的后面,要交换。A函数时间复杂度是O(n/2),B函数算法是O(sqrt(n)),大部分情况后者是优的,值更小。

lan_in的博客 1007

浅析SwingWorker

        正确理解和使用Swing线程模型编程是编写响应灵活的Swing程序的关键。从Java SE 6开始引进的SwingWorker能帮你轻松的编写多线程Swing程序,改善你Swing程序的结构,提高界面响应的灵活性。SDN(Sun developer Network)上有一篇很好的文章:Improve Application Performance With SwingWorker...

我有故事你有酒? 222

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【转】Java SwingWorker(一)

前言:------------------------------ 程序难免会使用到线程,在可视化Swing界面中大多数为客户端形式体现,其中界面流畅度就成了用户体验的影响之一,除了相应代码整洁减少冗余性及优化其中的算法和减少内存开销等方式,将一些处理过程耗时的命令交由一个新的线程去处理,使Swing组件可以继续接收用户操作即变相提高流畅性(耗时操作应该尽量不在EDT中进行)。 博主找了几篇较

only06的博客 869

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

使用SwingWorker异步加载JTree

SwingWorker是Java SE 6.0新加入的一个工具包,利用它可以使长时间运行并更新用户界面的任务大大简化。本文以一个异步加载JTree的demo演示了SwingWorker的基本功能。   环境准备   软件或资源 要求的版本 Java Development Kit (JDK) 6.0(5.0需要自行加入swingworker到class

傾城如夢的专栏 684

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

SwingWorker

本文示例代码请从这儿下载           正确理解和使用Swing线程模型编程是编写响应灵活的Swing程序的关键。从Java SE 6开始引进的SwingWorker能帮你轻松的编写多线程Swing程序,改善你Swing程序的结构,提高界面响应的灵活性。SDN(Sun developer Network)上有一篇很好的文章:Improve Application Perfor

B_H_L的专栏 1890
上一篇: java学习之浅谈多线程3--线程间协作
zhangxinbetter
博客等级 码龄12年 5粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值