Java自定义Future

Java自定义Future

极客大全推荐Java自定义Future这篇文章给大家,欢迎收藏极客大全享受知识的乐趣

公共数据接口,FutureData和RealData都要实现。
public interface Data {
      //获取线程结果
 public abstract String getRequest();
}

 

FutureData,当有线程想要获取RealData的时候,程序会被阻塞。等到RealData被注入才会使用getReal()方法。

public class FurureData implements Data {

 public volatile static boolean ISFLAG = false;
 private RealData realData;

 public synchronized void setRealData(RealData realData) {
  // 如果已经获取到结果,直接返回
  if (ISFLAG) {
   return;
  }
  // 如果没有获取到数据,传递真是对象
  this.realData = realData;
  ISFLAG = true;
  // 进行通知
  notify();
 }

//返回线程执行结果
 @Override
 public synchronized String getRequest() {
  while (!ISFLAG) {
   try {
    wait();
   } catch (Exception e) {

 

   }
  }
  // 获取到数据,直接返回
  return realData.getRequest();
 }

}

 

真实数据RealData
public class RealData implements Data {
 private String result;

 public RealData(String data) {
  System.out.println("正在使用data:" + data + "网络请求数据,耗时操作需要等待.");
  try {
   Thread.sleep(3000);
  } catch (Exception e) {

  }
  System.out.println("操作完毕,获取结果...");
  result = "success";
 }

 @Override
 public String getRequest() {
  return result;
 }

 

FutureClient  客户端

public class FutureClient {

 public Data request(String queryStr) {
  FurureData furureData = new FurureData();
  new Thread(new Runnable() {

   @Override
   public void run() {
    RealData realData = new RealData(queryStr);
    furureData.setRealData(realData);
   }
  }).start();
  return furureData;

 }

}

 

调用者:

public class Main {

 public static void main(String[] args) {
  FutureClient futureClient = new FutureClient();
  Data request = futureClient.request("请求参数.");
  System.out.println("请求发送成功!");
  System.out.println("执行其他任务...");
  String result = request.getRequest();
  System.out.println("获取到结果..." + result);
 }

}


调用者请求资源,client.request("name"); 完成对数据的准备
当要获取资源的时候,data.getResult() ,如果资源没有准备好isReady = false;那么就会阻塞该线程。直到资源获取然后该线程被唤醒。

 

原文链接:https://www.cnblogs.com/lei-jun/p/16476960.html

    

站长公告

极客大全专注硬核技术知识分享,助您享受知识的乐趣

热门标签