JAVA8-JDK自带Future,Callable,ExecutorService
代码示例:
package com.example.study.java8.funture;
import java.util.List;
import java.util.concurrent.*;
/**
* 和自定义Future中block一样会卡住
*/
public class FutureInAction2 {
public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
//创建一个单线程
ExecutorService executorService = Executors.newSingleThreadExecutor();
//返回一个future,里面的操作可能还没完成,但不影响后续的操作。
Future<String> future = executorService.submit(() -> {
try {
Thread.sleep(10000L);
return "I'm finished";
} catch (InterruptedException e) {
return "I'm error";
}
});
//没有结果会抛出,中断异常
String value = future.get();
System.out.println(value);
//关闭进程
executorService.shutdown();
//shutdownNow关闭进程,但是会返回有那些进程还没有执行完。
List<Runnable> runnables = executorService.shutdownNow();
}
}
输出结果:
I'm finished //会阻塞等待操作计算完成,才输出结果。
String value = future.get();
也可以添加其它参数,设置等待时间,如果超过时间没返回值,就抛出异常。
//最后等10秒没拿到,就抛出异常。
String value = future.get(10, TimeUnit.MICROSECONDS);
代码示例:
package com.example.study.java8.funture;
import java.util.List;
import java.util.concurrent.*;
/**
* 和自定义Future中block一样会卡住
*/
public class FutureInAction2 {
public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
//创建一个单线程
ExecutorService executorService = Executors.newSingleThreadExecutor();
//返回一个future,里面的操作可能还没完成,但不影响后续的操作。
Future<String> future = executorService.submit(() -> {
try {
Thread.sleep(10000L);
return "I'm finished";
} catch (InterruptedException e) {
return "I'm error";
}
});
//没有结果会抛出,中断异常
// String value = future.get();
//最后等10秒没拿到,就抛出异常。
String value = future.get(10, TimeUnit.MICROSECONDS);
System.out.println(value);
//关闭进程
executorService.shutdown();
//shutdownNow关闭进程,但是会返回有那些进程还没有执行完。
List<Runnable> runnables = executorService.shutdownNow();
}
}
抛出异常结果:
Exception in thread "main" java.util.concurrent.TimeoutException
at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:204)
代码示例:
package com.example.study.java8.funture;
import java.util.List;
import java.util.concurrent.*;
/**
* 和自定义Future中block一样会卡住
*/
public class FutureInAction3 {
public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
//创建一个单线程
ExecutorService executorService = Executors.newSingleThreadExecutor();
//返回一个future,里面的操作可能还没完成,但不影响后续的操作。
Future<String> future = executorService.submit(() -> {
try {
Thread.sleep(10000L);
return "I'm finished";
} catch (InterruptedException e) {
return "I'm error";
}
});
//判断future里面线程是否执行完成,没有执行完成,则继续等待10秒。
while(!future.isDone()){
Thread.sleep(10);
}
//最后执行完成,直接可以拿到结果
System.out.println(future.get());
//关闭进程
executorService.shutdown();
//shutdownNow关闭进程,但是会返回有那些进程还没有执行完。
List<Runnable> runnables = executorService.shutdownNow();
}
}
输出结果:
I'm finished //while中会判断是否执行完成,没有完成继续等待,知道执行完成后,直接打印结果
评论 (0)