Java并发多线程编程——Future设计模式实现的示例

Posted 小志的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java并发多线程编程——Future设计模式实现的示例相关的知识,希望对你有一定的参考价值。

一、Future的理解

在这里插入图片描述

  • Future接口属于 java.util.concurrent包下;
  • Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。
  • FutureTask实现了RunnableFuture接口,RunnableFuture接口继承了Runnable接口和Future接口,所以Future接口的使用与FutureTask类似;
  • 具体可参考此博文讲解的FutureTask类https://wwwxz.blog.csdn.net/article/details/117456141

二、Future设计模式实现的示例

1、创建产品类

package com.xz.thread.Future;

/**
 * @description: 创建一个产品类
 * @author: xz
 * @create: 2021-06-06 15:01
 */
public class Product {

    private int id;//产品id
    private String name;//产品name

    //setter、getter方法
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Product{" +
                "id=" + id +
                ", name='" + name + '\\'' +
                '}';
    }

    //构造方法,生产产品
    public Product(int id, String name) {
        System.out.println("生产产品【开始】:"+name);
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        this.id = id;
        this.name = name;
        System.out.println("生产产品【结束】:"+name);
    }
}

2、创建产品工厂类

package com.xz.thread.Future;

import java.util.Random;

/**
 * @description: 产品工厂类
 * @author: xz
 * @create: 2021-06-06 15:11
 */
public class ProductFactory {

    //生产产品方法,返回订单
    public Future createProduct(String name){
        System.out.println("下单成功!!!!!您可以去做其他事情了");
        //创建订单
        Future f =new Future();

        new Thread(new Runnable() {
            @Override
            public void run() {
                //创建产品
                Product product = new Product(new Random().nextInt(), name);
                //订单和产品进行关联
                f.setProduct(product);
            }
        }).start();

        return f;
    }
}

3、创建订单类

package com.xz.thread.Future;

/**
 * @description: 订单类
 * @author: xz
 * @create: 2021-06-06 15:35
 */
public class Future {
    //提供getter、setter方法关联
    private Product product;

    private boolean finish = false;//定义一个boolean类型的变量,表示是否完成,默认false表示完成

    public synchronized Product getProduct() {
        while(!finish){//如果没有完成
            try {
                wait();//等待
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return product;
    }

    public synchronized void setProduct(Product product) {
        if(finish){//如果完成,直接返回
            return;
        }
        this.product = product;
        this.finish =true;
        notify();//唤醒所有线程
    }
}

4、创建测试类

package com.xz.thread.Future;

/**
 * @description: 测试类
 * @author: xz
 * @create: 2021-06-06 15:50
 */
public class Demo {
    public static void main(String[] args) {
        //工厂创建产品
        ProductFactory productFactory =new ProductFactory();

        //下单、交钱
        System.out.println("下单并完成付款===========");

        // 工厂开始创建产品,返回订单
        Future f = productFactory.createProduct("蛋糕");

        System.out.println("游戏已,打完游戏回来取蛋糕------------");

        //返回产品
        System.out.println("戏已打完,我去取蛋糕"+f.getProduct());

    }



}

5、运行测试类类,输出结果如下:

在这里插入图片描述

以上是关于Java并发多线程编程——Future设计模式实现的示例的主要内容,如果未能解决你的问题,请参考以下文章

原创JAVA并发编程——Callable和Future源码初探

并发编程之Callable异步,Future模式

Java多线程与并发编程——ConditionCallable&Future

Java多线程与并发编程——ConditionCallable&Future

Java多线程与并发编程——ConditionCallable&Future

java:并发编程-Callable与Future模式