并发编程-Callable与Future模式

上一篇 <<<并发队列
下一篇 >>>Fork/Join框架


Callable与Future模式:Callable用来执行任务,Future用来获得结果。

底层的原理主要采用wait和notify

并发编程-Callable与Future模式_第1张图片

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 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 myTask = new MyTask<>(new MyCallableImpl());
new Thread(myTask).start();
String s = myTask.get();
System.out.println(s);

相关文章链接:
<<<多线程基础
<<<线程安全与解决方案
<<<锁的深入化
<<<锁的优化
<< << << << << << << << << << << <<<线程池
<<<并发队列
<< << << <<<如何优化多线程总结

你可能感兴趣的:(并发编程-Callable与Future模式)