java的Future设计模式实战

假设有个任务需要执行比较长的时间,而且有多个任务需要执行,某些任务之间可能有所关联,那么普通的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;
        }
    }
}

以下是程序运行结果:
在这里插入图片描述
在这里插入图片描述
具体可以看一下这篇博客

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值