千家信息网

Java多线程中Future设计模式怎么用

发表于:2025-01-27 作者:千家信息网编辑
千家信息网最后更新 2025年01月27日,这篇文章将为大家详细讲解有关Java多线程中Future设计模式怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Future -> 代表的是未来的一个凭据pub
千家信息网最后更新 2025年01月27日Java多线程中Future设计模式怎么用

这篇文章将为大家详细讲解有关Java多线程中Future设计模式怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

Future -> 代表的是未来的一个凭据

public interface Future {    T get() throws InterruptedException;}

AsynFuture -> Future具体实现类

public class AsynFuture implements Future {    private volatile boolean done = false;    private T result;    public void done(T result){        synchronized (this){            this.result = result;            this.done = true;            this.notifyAll();        }    }    /**     * 轮询 没有完成等待     */    @Override    public T get() throws InterruptedException {        synchronized (this) {            while (!done) {                this.wait();            }        }        return result;    }}

FutureService -> 桥接Future和FutureTask

public class FutureService {    /**     * 需进程等待     */    public  Future submit(final FutureTask task) {        AsynFuture asynFuture = new AsynFuture<>();        new Thread(() -> {            T result = task.call();            asynFuture.done(result);        }).start();        return asynFuture;    }    /**     * 运行完 自动回调     * 无需进程等待     */    public  Future submit(final FutureTask task, final Consumer consumer) {        AsynFuture asynFuture = new AsynFuture<>();        new Thread(() -> {            T result = task.call();            asynFuture.done(result);            consumer.accept(result);        }).start();        return asynFuture;    }}

FutureTask -> 将你的调用逻辑进行了隔离

public interface FutureTask {    T call();}

需要时回调:

/** * Future        -> 代表的是未来的一个凭据 * FutureTask    -> 将你的调用逻辑进行了隔离 * FutureService -> 桥接Future和FutureTask */public class SyncInvoker {    public static void main(String[] args) throws InterruptedException {        FutureService futureService = new FutureService();        Future future = futureService.submit(() -> {            try {                Thread.sleep(10001);            } catch (InterruptedException e) {                e.printStackTrace();            }            return "FINISH";        });        System.out.println("==============");        System.out.println("do other thing.");        Thread.sleep(1000);        System.out.println("==============");        /**         * 调用也形成了阻塞         */        System.out.println(future.get());    }}

运行:

==============
do other thing.
==============
FINISH

运行完自动回调:

//** * Future        -> 代表的是未来的一个凭据 * FutureTask    -> 将你的调用逻辑进行了隔离 * FutureService -> 桥接Future和FutureTask */public class SyncInvoker {    public static void main(String[] args) throws InterruptedException {        FutureService futureService = new FutureService();        futureService.submit(() -> {            try {                Thread.sleep(10001);            } catch (InterruptedException e) {                e.printStackTrace();            }            return "FINISH";        },System.out::println);        System.out.println("==============");        System.out.println("do other thing.");        Thread.sleep(1000);        System.out.println("==============");    }}

关于"Java多线程中Future设计模式怎么用"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

0