java多线程设置 线程超时 非阻塞实现

线程是属于异步计算模型,所以你不可能直接从别的线程中得到函数返回值。
这时候,Future就出场了。Futrue可以监视目标线程调用call的情况,当你调用Future的get()方法以获得结果时,当前线程就开始阻塞,直接call方法结束返回结果。
我目前的需求仅是线程超时 抛弃任务
设置超时方法

    Future<?> future = executor.submit(c);
        try {
            future.get(timeout, timeUnit);//阻塞 timeout超时时间  timeUnit设置单位
            return true;
        } catch (TimeoutException e) {
            future.cancel(true);//设置true  超时会终止这个任务,false会把任务跑完
            logger.info("任务执行超时,强制退出 ! 任务执行失败sum: " + getErrorCount() + "   this协议:" + message.getCmd() + " 超过:" + timeout+ " 毫秒  ");
            return false;
        }

CompletableFuture类实现了CompletionStage和Future接口。Future是Java 5添加的类,用来描述一个异步计算的结果,但是获取一个结果时方法较少,要么通过轮询isDone,确认完成后,调用get()获取值,要么调用get()设置一个超时时间。但是这个get()方法会阻塞住调用线程,这种阻塞的方式显然和我们的异步编程的初衷相违背。
为了解决这个问题,JDK吸收了guava的设计思想,加入了Future的诸多扩展功能形成了CompletableFuture。
CompletableFuture.supplyAsync 允许你基于ForkJoinPool 异步地运行一个任务,同时也有选项供你选择更多对线程池的控制
可以指定线程池
static CompletableFuture runAsync(Runnable runnable);
static CompletableFuture runAsync(Runnable runnable, Executor executor);//指定线程池
static CompletableFuture supplyAsync(Supplier supplier);
static CompletableFuture supplyAsync(Supplier supplier, Executor executor);//指定线程池

解决方案2 用jdk1.8 CompletableFuture.supplyAsync 方法 实现非阻塞
supplyAsync是异步提交任务(其实我感觉跟用线程提交类似)

*************************Future线程超时设置 对查询数据类操作 无法停止当前线程******************************

//返回值为boolean
CompletableFuture.supplyAsync(() -> {

            Future<?> future = executor.submit(c);
        try {
            future.get(timeout, timeUnit);//阻塞 timeout超时时间  timeUnit设置单位
            return true;
        } catch (TimeoutException e) {
            future.cancel(true);//设置true  超时会终止这个任务,false会把任务跑完
            logger.info("任务执行超时,强制退出 ! 任务执行失败sum: " + getErrorCount() + "   this协议:" + message.getCmd() + " 超过:" + timeout+ " 毫秒  ");
            return false;
        }



            return true;
        });





CompletableFuture.supplyAsync 方法Demo演示


import java.util.concurrent.CompletableFuture;
public class Test {

    public Test() {
        // TODO Auto-generated constructor stub
    }

    public static void main(String[] s) {
        System.err.println("Start");
        // 返回值为boolean
        CompletableFuture.supplyAsync(() -> {

            try {
                //阻塞10秒
                Thread.sleep(10 * 1000);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return true;
        });
        System.err.println("end");
    }
}
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Java jSerialComm是一款串口通信库,它提供了在Java应用程序中与串口通信的能力。要在多线程环境中使用jSerialComm进行串口通信,您可以使用以下步骤: 1. 在您的应用程序中引入jSerialComm库,具体步骤请参考jSerialComm官方文档。 2. 创建一个SerialPort对象,该对象将用于打开和关闭串口,并设置串口参数,如波特率、数据位、停止位和校验位。 ```java SerialPort serialPort = SerialPort.getCommPort("COM1"); serialPort.setBaudRate(9600); serialPort.setNumDataBits(8); serialPort.setNumStopBits(1); serialPort.setParity(SerialPort.NO_PARITY); ``` 3. 创建一个线程,该线程将用于从串口读取数据并处理它。您可以使用SerialPort.getInputStream()方法获取输入流,并从中读取数据。 ```java Thread readThread = new Thread(() -> { try { InputStream inputStream = serialPort.getInputStream(); byte[] buffer = new byte[1024]; int len = -1; while ((len = inputStream.read(buffer)) > -1) { // 处理收到的数据 } } catch (IOException e) { e.printStackTrace(); } }); ``` 4. 创建另一个线程,该线程将用于向串口写入数据。您可以使用SerialPort.getOutputStream()方法获取输出流,并将数据写入其中。 ```java Thread writeThread = new Thread(() -> { try { OutputStream outputStream = serialPort.getOutputStream(); byte[] data = new byte[] {0x01, 0x02, 0x03}; outputStream.write(data); outputStream.flush(); } catch (IOException e) { e.printStackTrace(); } }); ``` 5. 打开串口并启动线程。 ```java serialPort.openPort(); readThread.start(); writeThread.start(); ``` 请注意,以上代码仅作为示例,您需要根据自己的需求进行修改和扩展。同时,由于串口通信可能会出现各种问题,例如读取超时、奇偶校验错误等,您需要对这些问题进行适当处理,以确保您的应用程序具有良好的健壮性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值