并发编程-Callable与Future模式

作者: 迦叶_金色的人生_荣耀而又辉煌 | 来源:发表于2020-12-03 07:26 被阅读0次

上一篇 <<<并发队列
下一篇 >>>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框架
如何优化多线程总结

相关文章

网友评论

    本文标题:并发编程-Callable与Future模式

    本文链接:https://www.haomeiwen.com/subject/bygswktx.html