并行,并发的区别
并发:一个物理CPU上,多个任务有序的执行,指处理多个同时性任务的能力
并行:多个物理CPU上,多个任务同时执行,每一个CPU执行一个任务,可以同时处理的多个任务
用户线程和守护线程介绍
用户线程是系统的工作线程,会完成程序需要完成的业务操作。
守护线程是一种特殊的线程,为其他线程服务的,在后台默默的完成一些系统性的服务,如GC线程;
如果用户线程全部结束,意味着程序需要完成的业务操作已经结束了,守护线程就没有必要继续运行了。所以当系统只剩下守护线程的时候,java虚拟机会自动退出。
1、Future
Future接口(实现类FutureTask)定义了操作异步任务执行的一些方法,如获取异步任务执行的结果、取消任务的执行、判断任务是否被取消,判断任务是否执行完毕等。
Future接口可以为主线程开一个分支线程,专门为主线程处理耗时和费力的复杂异步计算任务。
Future接口方法介绍
取消异步任务:
boolean cancel(boolean mayInterruptIfRunning);
判断异步任务是否被取消
boolean isCancelled();
判断异步任务是否执行完毕
boolean isDone();
获取异步任务执行的结果:
V get() throws InterruptedException, ExecutionException;
获取异步任务执行的结果(限定时间内没获取到结果就抛出异常):
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
注:get方法获不加超时判断获取执行结果会出现程序阻塞,所以get方法一般放到程序最后调用
示例代码
//固定大小线程池
ExecutorService threadPool = Executors.newFixedThreadPool(3);
FutureTask<String> futureTask1 = new FutureTask<>(()->{
TimeUnit.MICROSECONDS.sleep(500);
return "callable1";
});
threadPool.submit(futureTask1);
FutureTask<String> futureTask2 = new FutureTask<>(()->{
TimeUnit.SECONDS.sleep(3);
return "callable2";
});
threadPool.submit(futureTask2);
//获取异步任务执行结果
while (true){
if (futureTask1.isDone()){
System.out.println(futureTask1.get());
break;
}
}
System.out.println(futureTask2.get(2,TimeUnit.SECONDS));
//关闭线程池
threadPool.shutdown();