上一篇 <<<并发队列
下一篇 >>>Fork/Join框架
Callable与Future模式:Callable用来执行任务,Future用来获得结果。
底层的原理主要采用wait和notify
Future提供的功能
(1)能够中断执行中的任务
(2)判断任务是否执行完成
(3)获取任务执行完成后的结果。
Future常用方法
V get() :获取异步执行的结果,如果没有结果可用,此方法会阻塞直到异步计算完成。
V get(Long timeout , TimeUnit unit) :获取异步执行结果,如果没有结果可用,此方法会阻塞,但是会有时间限制,如果阻塞时间超过设定的timeout时间,该方法将抛出异常。
boolean isDone() :如果任务执行结束,无论是正常结束或是中途取消还是发生异常,都返回true。
boolean isCanceller() :如果任务完成前被取消,则返回true。
boolean cancel(boolean mayInterruptRunning) :如果任务还没开始,执行cancel(...)方法将返回false;如果任务已经启动,执行cancel(true)方法将以中断执行此任务线程的方式来试图停止任务,如果停止成功,返回true;当任务已经启动,执行cancel(false)方法将不会对正在执行的任务线程产生影响(让线程正常执行到完成),此时返回false;当任务已经完成,执行cancel(...)方法将返回false。mayInterruptRunning参数表示是否中断执行中的线程。
Callable的优势
a、有返回
b、主线程不用等待
核心代码
ExecutorService executor = Executors.newCachedThreadPool();
Future<Integer> future = executor.submit(new AddNumberTask());
System.out.println(Thread.currentThread().getName() + "线程执行其他任务");
Integer integer = future.get();
System.out.println(integer);
// 关闭线程池
if (executor != null) {
executor.shutdown();
}
手写Callable与Future模式核心思路
public void run() {
result = myCallable.call();
// 唤醒阻塞线程
LockSupport.unpark(curThread);
// 也可以使用下列方式唤醒
/*synchronized (lock) {
lock.notify();
}*/
}
/**
* 结果返回
* @return
*/
public V get() {
// 获取结果,则直接返回
if (result != null) {
return result;
}
// 获得当前线程
curThread = Thread.currentThread();
// 未获得结果,则先阻塞,等run方法执行完成调用unpark后,自动继续执行
LockSupport.park(curThread);
// 也可以使用下列方式阻塞
/*synchronized (lock) {
try {
lock.wait();
} catch (Exception e) {
}
}*/
return result;
}
MyTask<String> myTask = new MyTask<>(new MyCallableImpl());
new Thread(myTask).start();
String s = myTask.get();
System.out.println(s);
相关文章链接:
多线程基础
线程安全与解决方案
锁的深入化
锁的优化
Java内存模型(JMM)
Volatile解决JMM的可见性问题
Volatile的伪共享和重排序
CAS无锁模式及ABA问题
Synchronized锁
Lock锁
AQS同步器
Condition
CountDownLatch同步计数器
Semaphore信号量
CyclicBarrier屏障
线程池
并发队列
Fork/Join框架
Threadlocal
Disruptor框架
如何优化多线程总结
网友评论