gpt4 book ai didi

java - InterruptedException 未被捕获

转载 作者:行者123 更新时间:2023-12-01 16:52:12 25 4
gpt4 key购买 nike

我正在学习 Java 并发,并尝试了 Java 教程中的示例,并进行了一些实验( try catch 异常)。

public class SleepMessages {
public static void main(String args[]) {
String importantInfo[] = {
"Mares eat oats",
"Does eat oats",
"Little lambs eat ivy",
"A kid will eat ivy too"
};

try { // my experiment
for (int i = 0; i < importantInfo.length; i++) {
Thread.sleep(4000);
System.out.println(importantInfo[i]);
}
}
catch (InterruptedException ie) {
System.out.println("caught InterruptedException");
}
}
}

我尝试通过“kill -2 $PID”向外部发送中断信号。

我预计当处理处于 sleep 状态时,信号会导致 Thread.sleep() 抛出异常,然后我可以捕获它,但实际上不能!

谁能解释一下为什么吗?(我想知道也许我发送信号(kill -2)的方式不正确。)

最佳答案

处理来自外部的SIGINT信号的方法是注册一个shutdown hook在您的应用程序中:

public class Main
{
public static void main(final String[] args) throws InterruptedException
{
Runtime.getRuntime().addShutdownHook(new Thread()
{
@Override
public void run()
{
System.out.println("Shutdown hook called!");
}
});

while (true)
{
Thread.sleep(1000);
}
}
}

现在,当您启动程序并使用 kill -2 <PID> 终止它时关闭钩子(Hook)将被调用,您可以正常关闭。

捕捉InterruptedException当您从应用程序内部使用 interrupt() 中断线程时,(您想要做的事情)是可能的。正如以下非常基本的示例所示:

public class Main
{
public static void main( final String[] args )
{

final Thread t1 = new Thread()
{
@Override
public void run()
{
try
{
while ( true )
{
Thread.sleep( 1000 );
}

}
catch ( final InterruptedException e )
{
System.out.println( "This thread was interrupted!" );
}
}
};
t1.start();
t1.interrupt();
}
}

br

关于java - InterruptedException 未被捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37982214/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com