Java多线程--4 Future模式


简单的Future模式


1、简单future模式代码,包含四个类FutureClient / FutureData / IData接口和接口实现 / Demo

public class Demo {

	public static void main(String[] args) {


		FutureClient client = new FutureClient();

		MemberData memberData = new MemberData();
		System.out.println("获取member数据。。。。。。");
		FutureData futureData = client.getFutureData(memberData, "zhangsan ");
		
		System.out.println("处理事务22222222222222");
		
		Object obj = futureData.getData();
		System.out.println("真实数据1: " + obj);

	}
}


public class FutureClient {

	public FutureData getFutureData(IDate realDate, Object obj) {
		FutureData futureData = new FutureData() ;
		new Thread() {
			@Override
			public void run() {
				System.out.println("进入future模式。。。。。。。。。。。。" + Thread.currentThread().getName());
				realDate.execute(obj) ;
				futureData.setData(realDate) ;
			}
		}.start(); 
		return futureData;
	}
}


public class FutureData {

	private boolean flag = true;
	private IDate idate ;

	public synchronized void setData(IDate idate) {
		this.idate = idate;
		flag = false;
		notify();
	}

	public synchronized Object getData() {
		/**
		 * 1、如果getData 比 setData 先执行, 由于flag为true,则进入wait等待状态(释放锁),
		 * 		等到setData执行后,getData获取到了锁,代码往下执行,
		 * 		flag值为false, 就跳出循环,直接return了
		 * 2、如果setData先执行, 执行完flag为false,锁也释放了, getData 就直接return
		 */
		while (flag) {
			try {
				System.out.println("wait ..................." + Thread.currentThread().getName());
				wait();
				System.out.println("wait  获取到了锁...................." + Thread.currentThread().getName());
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

		return idate.getData();
	}


}


public interface IDate{
	
	public Object getData() ;
	
	public void execute(Object obj) ;

}


public class MemberData implements IDate {

	private String output;

	@Override
	public String getData() {
		return this.output;
	}

	@Override
	public void execute(Object input) {
		
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		this.output = "member -- " + input  ;
	}

}


FutureData.getData先执行日志:

获取member数据。。。。。。
处理事务22222222222222
wait ...................main
进入future模式。。。。。。。。。。。。Thread-0
wait  获取到了锁....................main
真实数据1: member -- zhangsan



FutureData.setData先执行(Demo中休眠一段时间)

获取member数据。。。。。。
处理事务22222222222222
进入future模式。。。。。。。。。。。。Thread-0
真实数据1: member -- zhangsan





----------------------------------------------------------------------------------------------

2、   在上面代码基础上加一个线程 , 两个线程任务一起执行

import java.util.ArrayList;
import java.util.List;

public class Demo {

	public static void main(String[] args) {
		FutureClient client = new FutureClient();

		MemberData memberData = new MemberData();
		System.out.println("获取member数据。。。。。。");
		FutureData futureData = client.getFutureData(memberData, "zhangsan");
		
		System.out.println("处理其他事务2.。。。。。。");
		
		MoneyData moneyData = new MoneyData() ;
		List<Integer> dataList = new ArrayList<Integer>() ;
		dataList.add(12) ;
		dataList.add(15) ;
		FutureData futureData2 = client.getFutureData(moneyData, dataList);
		
		System.out.println("处理其他事务3。。。。。。");
		
		Object obj = futureData.getData();
		System.out.println("真实数据1: " + obj);
		
		Object obj2 = futureData2.getData();
		System.out.println("真实数据2: " + obj2);
		

	}
}


import java.util.ArrayList;

public class MoneyData implements IDate {

	private Integer output;

	@Override
	public Integer getData() {
		return this.output;
	}

	@Override
	public void execute(Object input) {
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		ArrayList<Integer> list = null ;
		if(input instanceof ArrayList) {
			list = (ArrayList<Integer>)input ;
		}else {
			return ;
		}

		int sum = 0 ;
		for (Integer integer : list) {
			sum += integer ;
		}
		this.output = sum ;
	}

}



执行结果:

获取member数据。。。。。。
处理其他事务2.。。。。。。
进入future模式。。。。。。。。。。。。Thread-0
处理其他事务3。。。。。。
wait ...................main
进入future模式。。。。。。。。。。。。Thread-1
wait  获取到了锁....................main
真实数据1: member -- zhangsan
wait ...................main
wait  获取到了锁....................main
真实数据2: 27



去掉MoneyData中的线程休眠

获取member数据。。。。。。
处理其他事务2.。。。。。。
进入future模式。。。。。。。。。。。。Thread-0
处理其他事务3。。。。。。
wait ...................main
进入future模式。。。。。。。。。。。。Thread-1
wait  获取到了锁....................main
真实数据1: member -- zhangsan
真实数据2: 27








多线程 future模式

2020.11.18 20:47

https://www.meihaocloud.com.com/244.html , 欢迎转载,请在文章页标出原文连接 !


Copyright © 2020 千夕网 联系站长

粤公网安备 44030302001408号 粤ICP备19099833号-1