欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java的Future设计模式实战

程序员文章站 2022-03-15 14:23:01
...

假设有个任务需要执行比较长的时间,而且有多个任务需要执行,某些任务之间可能有所关联,那么普通的java线程操作只能是将调度权交给CPU,由CPU决定某一时刻执行哪个任务,那么其余任务只能被阻塞起来,对于用户而言只能苦苦等待。然而Future接口提供了较好的方法来克服长时间等待的问题,即对于几个任务而言,如果第一个任务需要执行较长时间,而第二个任务和第一个任务之间又没有任何关联,那么Future接口的思路就是在第一个任务执行期间可以转而去执行第二个任务,体现出线程并发操作的思想。
以下是Future接口的简单实战,参照了一篇博客的代码进行了修改:

import java.util.Scanner;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

public class FutureCook {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        long startTime=System.currentTimeMillis();
        System.out.println("想做木瓜牛奶汤和京东肉饼啦!");
        Callable<Chuju> onlineShopping=new Callable<Chuju>() {
            public Chuju call() throws InterruptedException {
                System.out.println("网购厨具第一步:下单");
                TimeUnit.SECONDS.sleep(30);
                System.out.println("网购厨具第二步:等待送货");
                TimeUnit.SECONDS.sleep(30);
                System.out.println("网购厨具第三步:快递送达");
                Chuju chuju=new Chuju("电饭煲","砧板","电饼铛");
                System.out.println(chuju);
                return chuju;
            }
        };
        FutureTask<Chuju> task=new FutureTask<Chuju>(onlineShopping);
        new Thread(task).start();
        Thread.sleep(2000);
        Shicai shicai=new Shicai("木瓜","银耳","牛奶","面粉","肉馅");
        System.out.println("下厨第一步:食材到位");
        System.out.println(shicai);
        if(!task.isDone()) {
            System.out.println("下厨第二步:厨具还没到,等待中……");
        }
        System.out.println("是否取消订单?(请在30秒内做出回复!回复true或者false)");
        Thread.sleep(100);
        Scanner in=new Scanner(System.in);
        boolean name=in.nextBoolean();
        if(name==true)
        {
            task.cancel(true);
            System.out.println("已取消网购订单,去超市买厨具吧!");
            System.out.println("总共用时"+(System.currentTimeMillis()-startTime)+"ms");
        }
        else {
            Chuju chuju=task.get();
            System.out.println("下厨第三步:厨具到位,开始展现厨艺");
            cook(chuju,shicai);
            System.out.println("总共用时"+(System.currentTimeMillis()-startTime)+"ms");
        }
    }
    static void cook(Chuju chuju,Shicai shicai) {}
    static class Chuju{
        private String c1="null";
        private String c2="null";
        private String c3="null";
        public Chuju(String c1, String c2, String c3) {
            super();
            this.c1 = c1;
            this.c2 = c2;
            this.c3 = c3;
        }
        @Override
        public String toString() {
            return "网购的厨具:"+c1+","+c2+","+c3;
        }
    }
    static class Shicai{
        private String s1;
        private String s2;
        private String s3;
        private String s4;
        private String s5;
        public Shicai(String s1, String s2, String s3, String s4, String s5) {
            super();
            this.s1 = s1;
            this.s2 = s2;
            this.s3 = s3;
            this.s4 = s4;
            this.s5 = s5;
        }
        @Override
        public String toString() {
            return "准备的食材有:"+s1+","+s2+","+s3+","+s4+","+s5;
        }
    }
}

以下是程序运行结果:
java的Future设计模式实战
java的Future设计模式实战
具体可以看一下这篇博客