前言

我们先来了解下同步、异步有什么区别?

同步(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方法超时处理相关推荐

  1. 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 ...

  2. 帮做Java_代写Heuristics、代做SAT、代写Java语言设计、代做Java代做Prolog|帮做Haskell程序...

    代写Heuristics.代做SAT.代写Java语言设计.代做Java代做Prolog|帮做Haskell程序Heuristics and OptimizationLab assignment #2 ...

  3. java一天一次_做JAVA两年,月薪18k,这些自学心得你绝对值得借鉴

    我是一个做了两年java的小程序员,目前在杭州工作,月薪是18K,经历过两次跳槽,第一次跳槽拿到了12K的offer,第二次跳槽拿到现在18K的offer.我上的大专,在学校是学机电一体化的,接触过工 ...

  4. java好的代码_做java软件工程师,怎样才能写出好的代码?

    原标题:做java软件工程师,怎样才能写出好的代码? Java代码之于java程序员而言就是左膀右臂,java代码写的好的java程序员明显更是企业的欢迎,一个优秀的java程序员的考核标准之一也是看 ...

  5. 大数据时代,为什么很多JAVA程序员会转型做JAVA大数据

    分享之前推荐一个大数据交流学习群:722680258零基础进阶高级,需要学习大数据欢迎加入 JAVA的精密,强大,拥有其它语言不可替代的性能和可维护性,早已经是成为最受欢迎的编程语言之一,很多人想进入 ...

  6. Java实现线程同步的五种方法

    一.使用synchronized关键字 由于每个java对象都有一个内置锁,用synchronized修饰方法或者代码块时,内置锁会保护整个方法或代码块,要想执行这个方法或者代码块必须获得其内置锁,运 ...

  7. java 中不同步的意思,Java内存模型FAQ(六)没有正确同步的含义是什么?

    译者:Alex 没有正确同步的代码对于不同的人来说可能会有不同的理解.在Java内存模型这个语义环境下,我们谈到"没有正确同步",我们的意思是: 一个线程中有一个对变量的写操作, ...

  8. java mac 怎么删_做java服务器开发,并发布到linux,那MacBookPro开发是绝佳工具

    最近一直有学弟问买mbp开发Java好不好.我先给结论:不但好而且是最佳. 开始我用买MacBookPro,一是好奇和想了解不一样的电脑,二是MPBP太tm的精美了,第一次看到它,感觉之前塑料味特浓的 ...

  9. java登陆密码加密怎么做,Java如何实现密码加密

    在查询时,我们如果要对用户的登录信息进行加密,通常会将其密码进行加密. 1) 可以借助spring框架工具类DigestUtils 2) 也可以使用shiro框架来实现 以上就是两者方式分别使用, 注 ...

最新文章

  1. python学习笔记(二)——散列类型(字典、集合)
  2. VUE 项目作为服务启动
  3. HDU 3932 模拟退火
  4. 一步步编写操作系统 08 bios跳转到神奇的内存地址0x7c00
  5. 外部中断实验 编写程序学习外部中断的电平触发方式。无中断时发光让发光二极管从左到右依次点亮,有外部中断请求时,4位数码管从0000开始加1显示(加到9999后复位为0000),同时蜂鸣器报警。
  6. rust睡觉按键没反应_腐蚀Rust有哪些实用操作 腐蚀Rust实用操作汇总-游侠网
  7. 1000道Python题库系列分享十二(9道编程题)
  8. android 工作总结,Android项目的个人总结
  9. Ubuntu乌班图系统安装git和配置ssh
  10. 小波变换matlab程序,图像小波变换原理_图像小波变换的matlab实现详解
  11. No module named ‘_ssl‘
  12. windows7到底是多用户多任务操作系统还是单用户多任务操作系统
  13. Python—SJ—实验4—DNA翻译
  14. 两个可能常用到的几何知识(圆与椭圆的方程、求垂直向量)
  15. java获取图片的长宽尺寸(毫米)
  16. pycharm快捷键记录
  17. 一次解决你的图像尺寸和定位问题。
  18. 备战金九银十,腾讯T4梳理2022年最全999道Java岗必备面试题答案
  19. LSP是第一生产力 深夜开车,图片不够了怎么办?爪巴就完事了(爬虫爬取网页图片)
  20. 基于51单片机CO2二氧化碳气体浓度检测超限报警Proteus仿真

热门文章

  1. HTML网页设计:一、HTML的基本结构
  2. linux中有一个备份程序,技术|SBackup: 一个Linux下的简单备份软件
  3. word中如何设置默认英文字体和中文字体
  4. 正则html在线测试,正则作业.html
  5. 腾讯万亿级 Elasticsearch
  6. python爬取斗鱼主播图片_F_hawk189_新浪博客
  7. win10怎么开启aptx_Soomal作品 - Windows与OSX 操作系统对aptX支持的验证测试报告 [Soomal]...
  8. phpexcel 数字格式_php excel 设置单元格格式为文本格式
  9. JAVA中list根据某个字段排序
  10. C# DevExpress 皮肤控件记住设置