java线程的方便调用方式

一直用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()));

}
  

posted @ 2019-07-15 16:36  谷歌’s  阅读(248)  评论(0编辑  收藏  举报