一直用java的线程,总感觉写起来阅读或书写起来不是方便,改进之。

实现类:

public class Task<R> {

private ExecutorService executorService = Executors.newCachedThreadPool();
Future<R> future;
private Supplier<R> fuc;

public boolean cannel() {
return future.cancel(true);
}

public Task(Supplier<R> fuc) {
this.fuc = fuc;
}

class InnerTask implements Callable<R> {
@Override
public R call() {
return fuc.get();
}
}

public void start() {
this.future = executorService.submit(new InnerTask());
executorService.shutdown();
}

public R result() throws ExecutionException, InterruptedException {
if (!future.isCancelled()) {
return future.get();
}
throw new InterruptedException();
}
使用示例:

//一个超时的计算
public Integer sum(List<Integer> list) {
Integer sum = 0;
for (Integer integer : list) {
sum += integer;
}
return sum;
}

public String getClassName() {
return getClass().getName();
}

@Test
public void testTask1() throws ExecutionException, InterruptedException {
List<Integer> list = Arrays.asList(1, 2, 3);
Task<Integer> task = new Task(() -> {
Integer sum = 0;
for (Integer integer : list) {
sum += integer;
}
return sum;
});
task.start();
//这里继续书写其它业务逻缉
String className = getClassName();
//计算结果
System.out.println(className + "运行结果是:" + String.valueOf(task.result()));

}

@Test
public void testTask2() throws ExecutionException, InterruptedException {
List<Integer> l = Arrays.asList(1, 2, 3);
Task<Integer> task = new Task(() -> {
return new BIPayTest().sum(l);
});
task.start();
//这里继续书写其它业务逻缉
String className = getClassName();
//计算结果
System.out.println(className + "运行结果是:" + String.valueOf(task.result()));

}
  

java线程的方便调用方式的更多相关文章

  1. Java线程池的使用方式,核心运行原理、以及注意事项

    为什么需要线程池 java中为了提高并发度,可以使用多线程共同执行,但是如果有大量线程短时间之内被创建和销毁,会占用大量的系统时间,影响系统效率. 为了解决上面的问题,java中引入了线程池,可以使创 ...

  2. 并发编程系列:Java线程池的使用方式,核心运行原理、以及注意事项

    并发编程系列: 高并发编程系列:4种常用Java线程锁的特点,性能比较.使用场景 线程池的缘由 java中为了提高并发度,可以使用多线程共同执行,但是如果有大量线程短时间之内被创建和销毁,会占用大量的 ...

  3. Java线程的三种方式

    创建线程有三种方式: 1.继承Thread类 2.实现Runnable接口 3.使用Callable和Future创建线程 三种方式详解如下: ---------------------------- ...

  4. Java线程的实现/创建方式

    1.继承Thread类: Thread 类本质上是实现了 Runnable 接口的一个实例,代表一个线程的实例. 启动线程的唯一方法就是通过 Thread 类的 start()实例方法. start( ...

  5. java 线程三种实现方式

    1继承thread public class MultiThread1 extends Thread{ public void run(){ for(int i=0; i<7; i++){ Sy ...

  6. java 线程池的创建方式

    package com.nf147.Constroller; import java.util.concurrent.ExecutorService; import java.util.concurr ...

  7. Java内部接口的调用方式

    package com.hs.review; public class Person { public static void main(String[] args) { Person p1 = ne ...

  8. Java线程的概念

    1.      计算机系统 使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行:当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了. 缓 ...

  9. 基于 JVMTI 实现 Java 线程的监控(转)

    随着多核 CPU 的日益普及,越来越多的 Java 应用程序使用多线程并行计算来充分发挥整个系统的性能.多线程的使用也给应用程序开发人员带来了巨大的挑战,不正确地使用多线程可能造成线程死锁或资源竞争, ...

随机推荐

  1. Linux-常用shell简介及shell基本操作

    1.查询shell环境变量,切换shell种类 ​​​ 表明目前使用的shell种类是bash. 要想改变shell种类,在终端输入想要运行的shell名称即可.在切换shell种类的过程中,可能会操 ...

  2. 消息中间件RabbitMQ的使用

    原理场景 MQ在所有项目里面都很常见, 1.减少非紧急性任务对整个业务流程造成的延时: 2.减少高并发对系统所造成的性能上的影响: 举例几个场景: 1.给注册完成的用户派发优惠券.加积分.发消息等(派 ...

  3. Linux设备驱动程序 之 信号量和互斥体

    概念 一个信号量本质是一个整数值,它和一堆函数联合使用,这一对函数通常称为P和V:希望进入临界区的进程将在相关信号量上调用P:如果信号量的值大于零,则该值会减少1,进程可以继续执行:相反,如果信号量的 ...

  4. Android即时通讯开发之XMPP (一)初识XMPP协议和asmack

    在讲XMPP和asmck之前 ,我还是先分享一些资源文档,如果你有耐心,可以直接忽略我下面所写的.下面有关XMPP的介绍大部分是摘抄网上的文档,后面我会写一些基于XMPP协议和asmck开源库的聊天室 ...

  5. json-server搭建使用

    项目中前端和后端通常是并行开发,为了减少等待后端接口开发的时间,我们经常需要在本地模拟后端接口用来测试前端效果.这种做法称之为构建前端Mock. 本地启动一个静态服务,将所需要的接口写成json文件, ...

  6. python调试工具remote_pdb

    介绍一个调试python代码的工具:remote_pdb https://pypi.org/project/remote-pdb/ 安装 pip install remote-pdb 使用 1,设置断 ...

  7. 深度学习之DCGAN

    1.知识点 """ DCGAN:相比GAN而言,使用了卷积网络替代全连接 卷积:256*256*3 --- > 28*28*14 -->结果 ,即H,W变小, ...

  8. 用python读取csv信息并写入新的文件

    import csv fo = open("result.txt", "w+") reader = csv.reader(open('test.csv')) f ...

  9. 关于JavaWeb面试

    什么是JavaWeb? Java web  是指有Java语言开发出来可以在万维网上访问浏览的程序. Java Web,是用Java技术来解决相关web互联网领域的技术总和.web包括:web服务器和 ...

  10. java+web文件的上传和下载代码

    一般10M以下的文件上传通过设置Web.Config,再用VS自带的FileUpload控件就可以了,但是如果要上传100M甚至1G的文件就不能这样上传了.我这里分享一下我自己开发的一套大文件上传控件 ...