Java 客户端界面功能:停止当前操作
在我们用JAVA做客户端的时候,可能会遇上这么一个需求:停止当前正在执行的一个操作。
这个操作或者操作时间过长而让客户不想等待它,从而要停止它的执行。那这个操作怎么做呢?
我们都知道,我们在使用事件触发来执行一个业务方法,一般需要使用一个新的线程,否者当前的UI线程会卡死,以Swing为例,JButton被点击后触发事件的代码:
btn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {new Thread(new Runnable() {@Overridepublic void run() {//执行业务方法System.out.println("执行。这个方法要执行很久!!");}}).start();}});
那么我们要取消执行这个方法,最好最直接的做法就是停掉它。
所以我们要想一个办法来管理这些线程,在这里我没有使用线程池来管理,而是适用一个List来管理。
private static LinkedList<Thread> threadList = new LinkedList<Thread>();public static LinkedList<Thread> getThreadList() {return threadList;}
为什么要用LinkedList?因为它可以快速的找到头尾元素,从而提高性能。这里List我用它来装着每一个由UI启动的执行业务方法的线程。
loginBtn.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent evt) {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("登陆。。这个方法要执行5秒");}});thread.start(); //开始执行threadList.add(thread); //把线程放到List里 }});
既然把线程放在了List里,那要停止它很简单,把它找到,然后调用stop()方法:
private void stopBtnActionPerformed(ActionEvent e) {Thread thread = null;try{thread = threadList.getLast();thread.stop();System.out.println("操作被已手动停止");}catch(NoSuchElementException ex){System.out.println("没有正在执行的操作!");}catch(Exception exx){exx.printStackTrace();}finally{threadList.remove(thread); //从List移除这条线程。}}
为了防止stop()方法调用时报错,我们需要写一个扫描器来扫描哪些线程run()方法是已经执行完毕而不能调用stop()方法,run()方法执行完毕的线程就把它从List移除
import java.lang.Thread.State; import java.util.LinkedList;import com.alee.utils.ThreadUtils;/*** 保存每个执行操作的线程,并且定期清理已经结束的线程。* 主要用于“取消上次操作”功能。* @author g**/ public class ThreadListScaner implements Runnable{private LinkedList<Thread> threadList;public ThreadListScaner(){this.threadList = UIContext.getThreadList();}@Overridepublic void run() {//2秒扫描一次while(true){ThreadUtils.sleepSafely(2000);LinkedList<Thread> tempThreadList = new LinkedList<Thread>(threadList);for(Thread thread : tempThreadList){State state = thread.getState();if(state.equals(State.TERMINATED)){ //如果是TERMINATED状态,则移除这条线程 threadList.remove(thread);}}}} }
这里我把装线程的List缓存到一个叫UIContext的类里,其实就是一个装在各种全局可能需要用到的东西的类。
这个代码实现了一个功能:停止上一操作,每按一次停止按钮,就停止一条线程。
.
转载于:https://www.cnblogs.com/cha1r/p/3476175.html
Java 客户端界面功能:停止当前操作相关推荐
- java版mosquitto客户端使用SSL功能的具体操作总结
在开发java版mosquitto客户端程序时需要使用paho库,如果开发的java客户端要用ssl功能,则需要Bouncy Castle库:在使用ssl功能时,需要证书文件进行进行身份认证,但在测试 ...
- Redis介绍 Java客户端操作Redis
Redis介绍 && Java客户端操作Redis 本文内容 redis介绍 redis的 shell 客户端简介 redis的 java 客户端简介 环境配置 redis 2.8.1 ...
- Redis介绍 Java客户端操作Redis
分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow Redis介绍 & ...
- java客户端操作elasticsearch7.3.2版本
前面一篇介绍了使用kibana操作elasticsearch,使用的版本都是最新版7.3.2,现在我们开始使用java客户端来操作elasticsearch. 一.索引管理 1.1 搭建工程 1.1. ...
- java day47【redis概念 、下载安装 、 命令操作 、持久化操作 、使用Java客户端操作redis】...
第一章 Redis 1. 概念: redis是一款高性能的NOSQL系列的非关系型数据库 1.1.什么是NOSQL NoSQL(NoSQL = Not Only SQL),意即"不仅仅是S ...
- Unity3D界面功能操作讲解
转载自 脱莫柔Unity3D学习之旅 本文链接地址: Unity3D 界面功能操作讲解 Hierarchy 层次视图: 显示当前打开场景文件(Scene)在场景视图(Scene View)中的显示或隐 ...
- FTP 的Java客户端操作
注:文章皆为个人纪录,可用性请以最终结果为准,若有错还请大佬们指出,谢谢! 温馨提示:(默认权限下,暂不支持往本地的C盘中写入文件) 一.引入依赖 <!-- https://mvnreposit ...
- 【Redis】Java客户端操作reids数据库
目录 一.Java客户端分类 1.Jedis 2.lettuce 3.Redisson 二.Jedis 三.reids连接池 一.Java客户端分类 Redis提供了多个版本的Java客户端,其中推荐 ...
- 客户端界面实现及登录功能实现
文章目录 1 客户端界面实现及登录功能实现 1.1 界面设计 1.2 界面实现及实现登录对话框的功能 1 客户端界面实现及登录功能实现 1.1 界面设计 界面设计: 界面实现方案: 使用不同Layou ...
最新文章
- 计算机书籍-Go语言入门经典SAMS Teach Yourself
- 十年Java编程开发生涯,java计算时间差毫秒
- 电脑仙人掌机器人作文_神奇的仙人掌作文400字
- 淘宝端智能演进和思考
- 2. 移动安全渗透测试-(Android安全基础)
- Python学习笔记:集合(set)
- 马克·扎克伯格分享Facebook水冷数据中心照片
- 《ARM体系结构与编程》中的严重错误
- 如何设置变更Word页面颜色?干货经验!怎样操作更改word背景颜色?
- oracle报1653解决办法,“IMP-00058: 遇到 ORACLE 错误 1653”,如何解决?
- php 503解决办法,php设置页面返回503状态-php设置503http状态的方法-吾爱编程网
- 思考项目 求1+2的2次方+3的3次方+4的4次方+5的5次方+6的6次方的值。(异种循环嵌套)
- excel打开后灰色不显示内容?
- 北欧计算机专业出国,留学北欧,哪个国家计算机专业比较好?
- MySQL数据库性能优化史诗级大总结
- 百度工程师眼中的云原生可观测性追踪技术
- Black Hat Python3 Chapter4
- 2022国赛D题气象报文信息卫星通信传输参考代码及思路
- 汉白玉产地在哪里_汉白玉的产地 汉白玉是产自哪里的
- C4d lite r 16语言包,[其他软件] C4D S22 三维软件Maxon Cinema 4D S22.016 C4D R22 含中文语言包 破译版(Win)...
热门文章
- 做了5年Java,java读写锁使用
- 【深度学习】Swin-Transformer和EfficientNet对比分析
- 【洛谷搜索专题Python和C++解】DFS和BFS经典题目(陆续补充)
- 算法提高 学霸的迷宫
- dell服务器 稳定性,设计优秀管理方便 戴尔R710服务器评测
- mysql5.7.17配置_mysql5.7.17安装配置
- c# poi写入e_C# 使用 NPOI 库读写 Excel 文件(转载)
- at指令 fpga_FPGA毕设系列 | 无线通信
- python跟php如何共用mysql_Python 3 多个函数共用一个mysql连接
- 网站SEO优化该如何选择适合的关键词优化?