JAVA经典多线程设计模式

本文面向初学者,详细介绍了Java中的Future模式和Master-Woker模式。通过Future模式,展示了如何实现异步加载数据,避免阻塞主线程。接着,解释了Master-Woker模式,该模式将大任务分解为小任务并行执行,提高效率。同时,文章还提供了生产者-消费者模式的示例,展示了如何在多线程间共享内存缓存区进行通信。
摘要由CSDN通过智能技术生成

 为初学者而著!

Java基础是初学者的起点,是帮助你从小白入门到精通必学基础课程!

B站最新录制Java300集>>>   适合准备入行开发的零基础员学习Java,基于最新JDK13、IDEA平台讲解的,视频中穿插多个实战项目。每一个知识点都讲解的通俗易懂,由浅入深。不仅适用于零基础的初学者,有经验的程序员也可做巩固学习。

配套学习:​2022年Java300集最新录制课程上线了>>>​ 

一、Future模式

思想:

当service(Main方法模拟)请求一个数据的时候,可以先给他返回一个包装类(空壳,代理对象,未来data,FutureData)

然后开一个线程去异步加载真实数据,这样当service收到FutrueData,就可以做其他业务逻辑,

当要用的时候,再从FutureData中的方法去加载真实数据。(类似ajax的思想)

启动程序:模拟一个请求

/**
* 模拟一个service请求
*/
public class Main {
public static void main(String[] args) throws InterruptedException {

/**
* 未来模式的执行类,提供处理请求的方法handleRequest
*/
FutureExcutor fc = new FutureExcutor();

/**
* 1、Data是一个接口,提供实现类FuctureData和RealData
* 2、未来模式执行类,先给我们返回一个FuctureData,然后开了一个线程去加载真实数据了

*/
Data data = fc.handleRequest("请求参数");
/**
* 收到FutureData后,可以去处理其他业务逻辑
*/
System.out.println("做其他的事情...");

/**
* 1、处理完其他,要调用未来数据FutureData的方法加载真实数据了
* 1.1、这个getResultData肯定的是阻塞的,因为不确定真实数据是否加载 成功,只有当setResultData调用了,才能把阻塞打开
* 所以这两个方法getResultData、setResultData可以用阻塞队列来实现SynchronousQueue 
* 1.2、这里采用的是wait,notify,synchronized来实现的
*/
String result = data.getResultData();
System.out.println(result);

}
}

-

/**
* Future模式执行器
*/
public class FutureExcutor {
public Data handleRequest(final String queryStr){
//1 我想要一个代理对象(Data接口的实现类) 先返回给发送请求的客户端, 告诉他请求已经接收到,可以做其他的事情
final FutureData futureData = new FutureData();
//2 启动一个新的线程,去加载真实的数据,传递给这个代理对象
new Thread(new Runnable() {
@Override
public void run() {
//3 这个新的线程可以去慢慢的加载真实对象, 然后传递给代理对象
RealData realData = new RealData(queryStr);
futureData.setRealData(realData);
}
}).start();

return futureData;
}
}

-

/**
* 数据接口
*/
public interface Data {

/**
* 提供结果的接口
* @return
*/
String getResultData();

}

-

/**
* future数据实现Data
*/
public class FutureData implements Data{

private RealData realData ;

private boolean isReady = false;

public synchronized void setRealData(RealData realData) {
//如果已经装载完毕了,就直接返回
if(isReady){
return;
}
//如果没装载,进行装载真实对象
this.realData = realData;
isReady = true;
//进行通知
notify();
}

@Override
public synchronized String getResultData() {
//如果没装载好 程序就一直处于阻塞状态
while(!isRe

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值