用Java 实现一个异步任务 可终止,可中断,可继续功能
在 Java 中实现一个异步任务可以使用多线程和线程池技术,同时需要考虑终止、中断和继续等功能。下面展示一个简单的示例代码,实现异步任务的终止、中断和继续等功能:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class AsyncTask {
private ExecutorService executorService;
private Future<?> future;
private boolean paused = false;
public AsyncTask() {
executorService = Executors.newSingleThreadExecutor();
}
public void start(Runnable runnable) {
future = executorService.submit(() -> {
try {
runnable.run();
} catch (InterruptedException e) {
// 如果异步任务被中断,则直接结束
return;
}
});
}
public void stop() {
if (future != null) {
future.cancel(true);
}
}
public void pause() {
paused = true;
}
public void resume() {
paused = false;
}
public boolean isPaused() {
return paused;
}
}
上述代码中,AsyncTask 类封装了一个异步任务,其中 executorService 是一个线程池,future 为异步任务的返回结果,paused 表示异步任务是否处于暂停状态。
在 start 方法中启动异步任务,其中使用 try-catch 块捕获 InterruptedException 异常,以便在异步任务被中断时能够正确处理。在 stop 方法中终止异步任务,使用 future 变量的 cancel 方法来实现。在 pause 和 resume 方法中,通过设置 paused 变量的值来实现异步任务的暂停和继续。
在使用该异步任务时,可以创建一个 Runnable 对象并传递给 start 方法,例如:
AsyncTask task = new AsyncTask();
task.start(() -> {
for (int i = 1; i <= 10; i++) {
if (task.isPaused()) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
i--;
continue;
}
System.out.println(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
});
上述代码中,异步任务是一个简单的计数器,每隔一秒钟输出一个数字,如果异步任务被暂停,则等待一秒钟后再继续执行。可以通过调用 pause 和 resume 方法来暂停和继续异步任务,例如:
task.pause(); // 暂停异步任务
Thread.sleep(5000); // 等待 5 秒钟
task.resume(); // 继续异步任务
当异步任务被暂停时,计数器将暂停 5 秒钟,然后继续执行。可以使用 stop 方法来终止异步任务,例如:
task.stop(); // 终止异步任务
用Java 实现一个异步任务 可终止,可中断,可继续功能的更多相关文章
- Java 实现一个自己的显式锁Lock(有超时功能)
Lock接口 package concurency.chapter9; import java.util.Collection; public interface Lock { static clas ...
- 【转载】高性能IO设计 & Java NIO & 同步/异步 阻塞/非阻塞 Reactor/Proactor
开始准备看Java NIO的,这篇文章:http://xly1981.iteye.com/blog/1735862 里面提到了这篇文章 http://xmuzyq.iteye.com/blog/783 ...
- 深入理解Tornado——一个异步web服务器
本人的第一次翻译,转载请注明出处:http://www.cnblogs.com/yiwenshengmei/archive/2011/06/08/understanding_tornado.html原 ...
- 为什么用 Java:一个 Python 程序员告诉你
这篇文章专门给程序员写的,普通读者慎入.原作者:Kevin Sookocheff 译者:Celia Zhen,原文点击文末链接. 每当我告诉别人我一直在用Java工作时,大家的反应都是: “纳尼!Ja ...
- Java实现一个双向链表的倒置功能
题目要求:Java实现一个双向链表的倒置功能(1->2->3 变成 3->2->1) 提交:代码.测试用例,希望可以写成一个Java小项目,可以看到单元测试部分 该题目的代码, ...
- Netty实现的一个异步Socket代码
本人写的一个使用Netty实现的一个异步Socket代码 package test.core.nio; import com.google.common.util.concurrent.ThreadF ...
- Java多线程实现异步调用
在Java平台,实现异步调用的角色有如下三个角色:调用者. 提货单 .真实数据,一个调用者在调用耗时操作,不能立即返回数据时,先返回一个提货单 .然后在过一断时间后凭提货单来获取真正的数据.去蛋糕店买 ...
- java网络通信:异步非阻塞I/O (NIO)
转: java网络通信:异步非阻塞I/O (NIO) 首先是channel,是一个双向的全双工的通道,可同时读写,而输入输出流都是单工的,要么读要么写.Channel分为两大类,分别是用于网络数据的S ...
- Java回调实现异步 (转)
出处: Java回调实现异步 在正常的业务中使用同步线程,如果服务器每处理一个请求,就创建一个线程的话,会对服务器的资源造成浪费.因为这些线程可能会浪费时间在等待网络传输,等待数据库连接等其他事情上, ...
- Java实现一个简单的文件上传案例
Java实现一个简单的文件上传案例 实现流程: 1.客户端从硬盘读取文件数据到程序中 2.客户端输出流,写出文件到服务端 3.服务端输出流,读取文件数据到服务端中 4.输出流,写出文件数据到服务器硬盘 ...
随机推荐
- 15 CSS总结
15 CSS总结 到此,css的知识就结束了,掌握这些知识,搞爬虫足够了.如果朋友还有兴趣可以去css其他学习网站去看看其他的一些属性用法,(菜鸟教程 https://www.runoob.com/c ...
- #2-SAT,平面图#洛谷 3209 [HNOI2010] 平面图判定
题目传送门 分析 首先一张图是平面图的必要条件为 \(m\leq 3*n-6\), 然后考虑到这题的图存在哈密尔顿回路,也就是说非环边因为跨立形成奇环即为无解 那么直接拆点跑2-SAT就可以了 代码 ...
- 诚邀报名丨首期OpenHarmony开发者成长计划分享日
OpenAtom OpenHarmony(以下简称"OpenHarmony")开源开发者成长计划,是一项为了鼓励开发者积极参与开源软件的开发维护.帮助开发者在开源项目中成长的社会 ...
- HE琥珀虚颜破解自由安装程序教程(001)
HE琥珀虚颜破解自由安装程序教程(001) 前言 自从狗尾草跑路后,HE琥珀就没法用了,当前APP还没法破解,但是笔者找到了HE琥珀存在的一些漏洞,可以实现安装自己的APP. 所需工具 所需工具 1. ...
- 有奖调研 | 让虚拟照入现实的完美AR开发平台长什么样?
6年前的夏天,一款现实与虚拟结合的手游成了无数玩家的心头好,手握智能手机,玩家就能在真实世界来一场妙趣横生的探险,收集动漫作品里如数家珍的宠物精灵.AR技术结合用户熟识喜爱的内容形式,与现实环境中扩充 ...
- python读取ini配置文件-configparser使用方法
我们在操作 ini 配置文件的时候 可以使用 Python 的 configparser 库 具体使用方法如下: from configparser import ConfigParser # 初始化 ...
- 重新点亮shell————awk函数[十五]
前言 简单介绍一下awk函数. 正文 算术函数 字符串函数 自定义函数 例子: 结 awk就到这里了.
- Mac 修改版本号
修改版本号 在安装某些软件(XCode)的过程中, 系统会提示版本低,需要升级到高版本, 而很多人不想升级而需要安装这些软件, 此时只需将版本号修改成软件安装要求的版本号就可以了. 由于SystemV ...
- Oracle sql 判断全角字符
(lengthb(MC) - length(MC))<>(lengthb(to_single_byte(MC)) - length(to_single_byte(MC)))
- 【笔记】Oracle使用笔记 0-sql injection&&&result of string concatenation is too long
报错:数据库操作错误."27,34006/v1:0-sql injection(SQL注入) 出现这个报错的情况背景是使用后端函数进行前端SQL语句组合进行数据插入的时候的提示 不太清楚是因 ...