简单的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