java单线程异步_Java 实现异步调用

首先 我遇到的问题是 接口调用时需要更新缓存 而更新缓存又是个说快不快的过程 所以打算做异步调用 返回我所需要的结果即可 ,至于缓存什么时候更新完 就不是我所需要关注的了

废话不多说 上代码

public class MyExecutor {

private ExecutorService executor = Executors.newCachedThreadPool() ;

public void fun() throws Exception {

executor.submit(new Runnable(){

@override

public void run() {

try {

//要执行的业务代码,我们这里没有写方法,可以让线程休息几秒进行测试

Thread.sleep(10000);

System.out.print("睡够啦~");

}catch(Exception e) {

throw new RuntimeException("报错啦!!");

}

}

});

}

}

public class Demo{

public static void main(String[] args) {

MyExecutor  myExecutor = new MyExecutor();

try {

myExecutor.fun();

System.our.print("你先睡着,我先回家啦~");

}catch(Exception e) {

throw new RuntimeException("业务程序报错啦!!");

}

}

}

好啦 代码到此结束 (ps:纯手打 若有错 请见谅)

运行主方法

会先打印(你先睡着,我先回家啦~)

然后(睡够啦~)

也就是说 在需要异步执行的方法未执行完毕时 主程序已经返回结果了  不需要继续等待 这样可以保证程序先返回结果 再继续执行不需要等待的繁琐的任务  当然也可以加一些方法去判断异步方法是否执行完毕。

说一下Executors类

这个类是用来创建线程池的

有这么几个方法

1、newFixedThreadPool() 创建固定大小的线程池 线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程

2、newCachedThreadPool() 创建一个可缓存的线程池,如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60s不执行任务)的线程,当任务数量增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于系统(JVM)能够创建的最大线程大小

3、newSingleThreadExecutor() 创建一个单线程的线程池。这个线程池只有线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行

4、newScheduledThreadPool() 创建一个大小无限的线程池,此线程池支持定时以及周期性执行任务的需求

5、newSingleThreadScheduledExecutor() 创建一个单线程的线程池。此线程池支持定时以及周期性执行任务的需求

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

作者:LittleYoungMan

来源:CSDN

原文:https://blog.csdn.net/java_ying/article/details/79803470

版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,单线程异步处理通常使用事件驱动模型来实现。以下是一个简单的示例代码,演示了如何使用 Java NIO(非阻塞 I/O)和 Selector 类来实现单线程异步处理。 ```java import java.nio.channels.*; import java.nio.*; import java.util.*; public class AsyncHandler { private Selector selector; public AsyncHandler() throws Exception { selector = Selector.open(); } public void start() throws Exception { while (true) { selector.select(); Iterator<SelectionKey> keys = selector.selectedKeys().iterator(); while (keys.hasNext()) { SelectionKey key = keys.next(); keys.remove(); if (!key.isValid()) { continue; } if (key.isReadable()) { handleRead(key); } else if (key.isWritable()) { handleWrite(key); } } } } private void handleRead(SelectionKey key) throws Exception { SocketChannel channel = (SocketChannel) key.channel(); ByteBuffer buffer = ByteBuffer.allocate(1024); int bytesRead = channel.read(buffer); if (bytesRead == -1) { channel.close(); key.cancel(); return; } // 处理读取到的数据 buffer.flip(); byte[] data = new byte[buffer.limit()]; buffer.get(data); System.out.println("Received: " + new String(data)); // 注册写事件 channel.register(selector, SelectionKey.OP_WRITE); } private void handleWrite(SelectionKey key) throws Exception { SocketChannel channel = (SocketChannel) key.channel(); String response = "Hello, client!"; byte[] data = response.getBytes(); ByteBuffer buffer = ByteBuffer.wrap(data); channel.write(buffer); // 注册读事件 channel.register(selector, SelectionKey.OP_READ); } } ``` 在上面的代码中,我们使用 `Selector` 类来监听 I/O 事件。在 `start()` 方法中,我们进入一个无限循环,不断地调用 `selector.select()` 方法来等待事件的发生。 当某个事件发生时,我们会得到一个 `SelectionKey` 对象,在这里我们判断它是可读事件还是可写事件,然后分别调用 `handleRead()` 和 `handleWrite()` 方法来处理它们。 在 `handleRead()` 方法中,我们使用 `SocketChannel` 类来读取数据,并将读取到的数据处理后再注册写事件。在 `handleWrite()` 方法中,我们向客户端发送一条消息,并注册读事件。 需要注意的是,由于我们只有一个线程在处理所有的事件,因此处理事件的方法都必须是非阻塞的,否则会阻塞整个程序的执行。在上面的代码中,我们使用了 `SocketChannel.read()` 和 `SocketChannel.write()` 方法来读写数据,它们都是非阻塞的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值