并发编程-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