java feature task同步_FetrueTask做java方法超时处理
前言
我们先来了解下同步、异步有什么区别?
同步(Sync)
所谓同步,就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作。
根据这个定义,Java中所有方法都是同步调用,应为必须要等到结果后才会继续执行。我们在说同步、异步的时候,一般而言是特指那些需要其他端协作或者需要一定时间完成的任务。
简单来说,同步就是必须一件一件事做,等前一件做完了才能做下一件事。
异步(Async)
异步与同步相对,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。当这个调用完成后,一般通过状态、通知和回调来通知调用者。对于异步调用,调用的返回并不受调用者控制。
对于通知调用者的三种方式,具体如下:
情况
作用
状态
即监听被调用者的状态(轮询),调用者需要每隔一定时间检查一次,效率会很低。
通知
当被调用者执行完成后,发出通知告知调用者,无需消耗太多性能。
回调
与通知类似,当被调用者执行完成后,会调用调用者提供的回调函数。
FutureTask概念
FutureTask一个可取消的异步计算,FutureTask 实现了Future的基本方法,可以查询计算是否已经完成,并且可以获取计算的结果。结果只可以在计算完成之后获取,get方法会阻塞当计算没有完成的时候,一旦计算已经完成,那么计算就不能再次启动或是取消。
一个FutureTask 可以用来包装一个 Callable 或是一个runnable对象。因为FurtureTask实现了Runnable方法,所以一个 FutureTask可以提交(submit)给一个Excutor执行(excution).
FutureTask使用场景
FutureTask可用于异步获取执行结果或取消执行任务的场景。通过传入Runnable或者Callable的任务给FutureTask,直接调用其run方法或者放入线程池执行,之后可以在外部通过FutureTask的get方法异步获取执行结果,因此,FutureTask非常适合用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。另外,FutureTask还可以确保即使调用了多次run方法,它都只会执行一次Runnable或者Callable任务,或者通过cancel取消FutureTask的执行等。
FutureTask执行多任务计算的使用场景
利用FutureTask和ExecutorService,可以用多线程的方式提交计算任务,主线程继续执行其他任务,当主线程需要子线程的计算结果时,在异步获取子线程的执行结果。
这里写了一个小demo直接上代码:
package com.silin;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
public class Test03 {
public static ExecutorService executor = Executors.newSingleThreadExecutor(); //创建一个线程池
public static long start = System.currentTimeMillis(); //获取执行到这行代码的系统时间
public static boolean flag = false; //定义个标识
public static int time = 5000; //定义方法的消耗时间
public static int timeout = 2000; //定义超时的时间
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
String result = timeoutMethod(timeout); //调用timeoutMethod(timeout)方法,并传一个实参
System.out.println("整个方法实际耗时:" + (System.currentTimeMillis() - start) + "毫秒"); //打印执行完timeoutMethod(timeout)的方法时间
System.out.println("结果:" + result);
}catch(Exception e){
e.printStackTrace();
System.out.println("异常");
}
}
/**
* 有超时时间的方法
* @param timeout
* @return
*/
private static String timeoutMethod(int timeout) throws Exception{
String result = "false";
FutureTask futureTask = new FutureTask<>(new Callable() { //一个可取消的异步计算。该类提供了一个基类
@Override
public String call() throws Exception {
//TODO
boolean bool = unknowMethod(time); //调用unkonwMethod(time)方法
return "false";
}
});
executor.execute(futureTask); //池化线程或调用中执行futureTask
try {
result = futureTask.get(timeout, TimeUnit.MILLISECONDS); //这个方法会阻塞,直到任务完成时会返回
} catch (InterruptedException | ExecutionException | TimeoutException e) {
//e.printStackTrace();
flag = true;
futureTask.cancel(true); // 为false时,会等待这个任务执行完,返回true;若任务还没执行,取消任务后返回true,如任务执行完,返回false
result = "false";
System.out.println("方法实际执行时间:" + (System.currentTimeMillis() - start) + "毫秒");
executor.shutdown();
}
return result;
}
/**
* 这个方法的耗时
* @return
*/
private static boolean unknowMethod (int time) throws Exception{
if(flag){
Thread.sleep(time);
System.out.println("任务需要耗时: " + time + "毫秒" + "___标志" + flag);
}else{
System.out.println("不执行");
}
return flag;
}
}
FeatureTast部分方法:
情况
作用
report(int s)
返回已完成任务的结果或引发异常。
isCancelled()
判断task是否在正常完成前取消掉了。
isDone()
返回ture或false
cancel(boolean mayInterruptIfRunning)
取消task的执行,如果task已完成、已被取消、或者由于某些原因取消不了,则返回false
get()
等待task完成,并获取执行结果。可能会抛出异常
get(long timeout, TimeUnit unit)
在指定的时间内等待task完成,并获取执行结果。可能抛出异常(含TimeoutException)
总结:
通过一个小小的demo,进行修改,改成小伙伴所需的。
如果写的不好,还请小伙伴多多批评指正。
java feature task同步_FetrueTask做java方法超时处理相关推荐
- java程序设计实验报告代写_代写file I/O作业、代写java Scanner I/O程序、代写java编程作业、代做java实验报告...
代写file I/O作业.代写java Scanner I/O程序.代写java编程作业.代做java实验报告 日期:2018-09-05 03:40 ?Objectives oCreate a pr ...
- 帮做Java_代写Heuristics、代做SAT、代写Java语言设计、代做Java代做Prolog|帮做Haskell程序...
代写Heuristics.代做SAT.代写Java语言设计.代做Java代做Prolog|帮做Haskell程序Heuristics and OptimizationLab assignment #2 ...
- java一天一次_做JAVA两年,月薪18k,这些自学心得你绝对值得借鉴
我是一个做了两年java的小程序员,目前在杭州工作,月薪是18K,经历过两次跳槽,第一次跳槽拿到了12K的offer,第二次跳槽拿到现在18K的offer.我上的大专,在学校是学机电一体化的,接触过工 ...
- java好的代码_做java软件工程师,怎样才能写出好的代码?
原标题:做java软件工程师,怎样才能写出好的代码? Java代码之于java程序员而言就是左膀右臂,java代码写的好的java程序员明显更是企业的欢迎,一个优秀的java程序员的考核标准之一也是看 ...
- 大数据时代,为什么很多JAVA程序员会转型做JAVA大数据
分享之前推荐一个大数据交流学习群:722680258零基础进阶高级,需要学习大数据欢迎加入 JAVA的精密,强大,拥有其它语言不可替代的性能和可维护性,早已经是成为最受欢迎的编程语言之一,很多人想进入 ...
- Java实现线程同步的五种方法
一.使用synchronized关键字 由于每个java对象都有一个内置锁,用synchronized修饰方法或者代码块时,内置锁会保护整个方法或代码块,要想执行这个方法或者代码块必须获得其内置锁,运 ...
- java 中不同步的意思,Java内存模型FAQ(六)没有正确同步的含义是什么?
译者:Alex 没有正确同步的代码对于不同的人来说可能会有不同的理解.在Java内存模型这个语义环境下,我们谈到"没有正确同步",我们的意思是: 一个线程中有一个对变量的写操作, ...
- java mac 怎么删_做java服务器开发,并发布到linux,那MacBookPro开发是绝佳工具
最近一直有学弟问买mbp开发Java好不好.我先给结论:不但好而且是最佳. 开始我用买MacBookPro,一是好奇和想了解不一样的电脑,二是MPBP太tm的精美了,第一次看到它,感觉之前塑料味特浓的 ...
- java登陆密码加密怎么做,Java如何实现密码加密
在查询时,我们如果要对用户的登录信息进行加密,通常会将其密码进行加密. 1) 可以借助spring框架工具类DigestUtils 2) 也可以使用shiro框架来实现 以上就是两者方式分别使用, 注 ...
最新文章
- python学习笔记(二)——散列类型(字典、集合)
- VUE 项目作为服务启动
- HDU 3932 模拟退火
- 一步步编写操作系统 08 bios跳转到神奇的内存地址0x7c00
- 外部中断实验 编写程序学习外部中断的电平触发方式。无中断时发光让发光二极管从左到右依次点亮,有外部中断请求时,4位数码管从0000开始加1显示(加到9999后复位为0000),同时蜂鸣器报警。
- rust睡觉按键没反应_腐蚀Rust有哪些实用操作 腐蚀Rust实用操作汇总-游侠网
- 1000道Python题库系列分享十二(9道编程题)
- android 工作总结,Android项目的个人总结
- Ubuntu乌班图系统安装git和配置ssh
- 小波变换matlab程序,图像小波变换原理_图像小波变换的matlab实现详解
- No module named ‘_ssl‘
- windows7到底是多用户多任务操作系统还是单用户多任务操作系统
- Python—SJ—实验4—DNA翻译
- 两个可能常用到的几何知识(圆与椭圆的方程、求垂直向量)
- java获取图片的长宽尺寸(毫米)
- pycharm快捷键记录
- 一次解决你的图像尺寸和定位问题。
- 备战金九银十,腾讯T4梳理2022年最全999道Java岗必备面试题答案
- LSP是第一生产力 深夜开车,图片不够了怎么办?爪巴就完事了(爬虫爬取网页图片)
- 基于51单片机CO2二氧化碳气体浓度检测超限报警Proteus仿真
热门文章
- HTML网页设计:一、HTML的基本结构
- linux中有一个备份程序,技术|SBackup: 一个Linux下的简单备份软件
- word中如何设置默认英文字体和中文字体
- 正则html在线测试,正则作业.html
- 腾讯万亿级 Elasticsearch
- python爬取斗鱼主播图片_F_hawk189_新浪博客
- win10怎么开启aptx_Soomal作品 - Windows与OSX 操作系统对aptX支持的验证测试报告 [Soomal]...
- phpexcel 数字格式_php excel 设置单元格格式为文本格式
- JAVA中list根据某个字段排序
- C# DevExpress 皮肤控件记住设置