最近公司项目出现拿不到锁的情况:false= lock.tryLock();
因为某些异常导致两次去重启项目ping端口
因为scheduledThreadPool.scheduleAtFixedRates初始化延迟参数设置不合适的原因
以至于阻塞队列拿到了两个相同的端口
在同时拿到这个端口去执行任务时,因为一个在执行,另一个就会有拿不到锁的情况
以下是相关测试类:
(参数1=Runnable,参数2=初始延迟时间,参数3=任务间隔时间,参数4=时间单位)
package com.etoplive.test;
import com.etoplive.srvccommon.utils.KillProcessUtils;
import com.etoplive.srvccommon.utils.OcrHttpUtil;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author shaoFeng
* @date 2022/8/24 17:26
* @description
*/
public class ScheFixRateTest {
private static BlockingQueue<Integer> blockingQueue;
public static void pingPort(Integer port) {
blockingQueue = new ArrayBlockingQueue(2);
AtomicInteger count = new AtomicInteger(0);
ScheduledExecutorService scheduledThreadPool = Executors.newSingleThreadScheduledExecutor();
//(参数1=Runnable,参数2=初始延迟时间,参数3=任务间隔时间,参数4=时间单位)
scheduledThreadPool.scheduleAtFixedRate(() -> {
if (!blockingQueue.contains(port)) {
blockingQueue.add(port);
System.out.println("查看输出语句输出几次");
}
scheduledThreadPool.shutdown();
return;
}, 60, 10, TimeUnit.SECONDS);
}
public static void main(String[] args) throws InterruptedException {
pingPort(18001);
pingPort(18001);
}
}
当初始化延迟时间设的过长时,输出语句为:
因为在第二次方法进来是是在60秒之内,而间隔10分钟记录的最初时间是在60秒的最初,这样就会同时拿到这个线程去执行,而此时的阻塞队列都不包含有相同端口存在的情况,所以最后加了两个同样的端口
如果初始化延迟时间设置为1s则不会有这样的情况: