Multithreading 将实例调用到同一线程内的线程

Multithreading 将实例调用到同一线程内的线程,multithreading,java-8,sonarlint,Multithreading,Java 8,Sonarlint,上下文: 我有一个用java编写的cmd应用程序,它在不同的服务器上以对等模式工作。一旦服务器启动,所有其他实例都必须停止。所以我编写了一段代码,它在低优先级线程中运行,并监视一个原子布尔值autoClose,每当autoClose设置为true时,线程就会关闭应用程序。(注意:我不想手动添加close,因为应用程序有2个主高优先级线程和许多临时正常优先级线程) 代码如下: /** * Watches autoClose boolean value and closes the connect

上下文:

我有一个用java编写的cmd应用程序,它在不同的服务器上以对等模式工作。一旦服务器启动,所有其他实例都必须停止。所以我编写了一段代码,它在低优先级线程中运行,并监视一个原子布尔值
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相比,它更简单且可能更有效