Multithreading 将实例调用到同一线程内的线程
上下文: 我有一个用java编写的cmd应用程序,它在不同的服务器上以对等模式工作。一旦服务器启动,所有其他实例都必须停止。所以我编写了一段代码,它在低优先级线程中运行,并监视一个原子布尔值Multithreading 将实例调用到同一线程内的线程,multithreading,java-8,sonarlint,Multithreading,Java 8,Sonarlint,上下文: 我有一个用java编写的cmd应用程序,它在不同的服务器上以对等模式工作。一旦服务器启动,所有其他实例都必须停止。所以我编写了一段代码,它在低优先级线程中运行,并监视一个原子布尔值autoClose,每当autoClose设置为true时,线程就会关闭应用程序。(注意:我不想手动添加close,因为应用程序有2个主高优先级线程和许多临时正常优先级线程) 代码如下: /** * Watches autoClose boolean value and closes the connect
autoClose
,每当autoClose设置为true时,线程就会关闭应用程序。(注意:我不想手动添加close,因为应用程序有2个主高优先级线程和许多临时正常优先级线程)
代码如下:
/**
* Watches autoClose boolean value and closes the connector once it is true
* <p>
* This is a very low priority thread which continuously monitors autoClose
*/
protected void watchAndClose() {
Thread watchAutoClose = new Thread(() -> {
while (true) {
if (autoClose.get()) {
close();
// wait till closing is successful
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException ignored) {
// I want instance of thread watchAutoClose so I can call this
// watchAutoClose.interrupt();
}
if (!component.getStatus()) setAutoClose(false);
}
}
});
watchAutoClose.setPriority(Thread.MIN_PRIORITY);
watchAutoClose.start();
}
/**
*监视autoClose布尔值,并在该值为真时关闭连接器
*
*这是一个非常低优先级的线程,持续监视自动关闭
*/
受保护的void watchAndClose(){
线程watchAutoClose=新线程(()->{
while(true){
if(autoClose.get()){
close();
//等待关闭成功
试一试{
时间单位。秒。睡眠(1);
}捕获(InterruptedException被忽略){
//我想要线程watchAutoClose的实例,这样我就可以调用它了
//watchAutoClose.interrupt();
}
如果(!component.getStatus())设置自动关闭(false);
}
}
});
watchAutoClose.setPriority(线程最小优先级);
watchAutoClose.start();
}
问题:
SonarLint说我不能让InterruptedException部分为空。我要么再次抛出它,要么调用thatThread.interrupt()
那我该怎么做呢?我希望在该线程中有一个线程watchAutoClose
的实例,以便调用watchAutoClose.interrupt()
。我尝试了Thread.currentThread()
,但我担心有这么多线程,当前执行的线程不会是这个线程。(也就是说,当JVM在catch子句中并调用thread.currentThread()
时,JVM有可能选择切换到另一个线程,因此此时当前线程将是另一个线程,我会中断另一个线程……如果我太担心或者我的概念完全错误,请纠正我。)
或者我应该完全忽略这个警告而离开catch block吗?首先,不清楚为什么你认为等待一秒钟是必要的。当
close()
方法返回时,close()
方法已经完成。另一方面,如果close()
此外,为了解决您的文字问题,Thread.currentThread()
始终返回调用线程的实例。线程不处于运行状态就不可能执行该方法。当任务切换发生时,线程根本无法读取引用,直到它再次获得CPU时间。除此之外,由于规范说明此方法返回表示调用方的线程
实例,因此环境必须确保此属性,而不管它是如何实现的。即使多个线程在不同的CPU内核上同时调用此方法,它也可以工作
所以,不管等待一秒钟的方法有多可疑,像
试试看{
时间单位。秒。睡眠(1);
}捕获(InterruptedException被忽略){
Thread.currentThread().interrupt();
}
这是一种有效的方法
但您也可以将此代码替换为
LockSupport.parknos(时间单位.秒.toNanos(1));
parknos
方法将在中断时静默返回,使调用线程处于中断状态。因此,它与捕获InterruptedException
和恢复中断状态具有相同的效果,但更简单,可能更有效,因为不需要构造、抛出和捕获异常
另一点是,当变量为false时,您正在原子变量上创建一个轮询循环,消耗CPU周期,这是不鼓励的,即使您给线程一个低优先级。首先,不清楚为什么您认为等待一秒钟是必要的。当close()
方法返回时,close()
方法已经完成。另一方面,如果close()
此外,为了解决您的文字问题,Thread.currentThread()
始终返回调用线程的实例。线程不处于运行状态就不可能执行该方法。当任务切换发生时,线程根本无法读取引用,直到它再次获得CPU时间。除此之外,由于规范说明此方法返回表示调用方的线程
实例,因此环境必须确保此属性,而不管它是如何实现的。即使多个线程在不同的CPU内核上同时调用此方法,它也可以工作
所以,不管等待一秒钟的方法有多可疑,像
试试看{
时间单位。秒。睡眠(1);
}捕获(InterruptedException被忽略){
Thread.currentThread().interrupt();
}
这是一种有效的方法
但您也可以将此代码替换为
LockSupport.parknos(时间单位.秒.toNanos(1));
parknos
方法将在中断时静默返回,使调用线程处于中断状态。因此,它与捕获InterruptedException
并恢复中断状态具有相同的效果,但与无异常nee相比,它更简单且可能更有效