[英]Stopping or Interrupting a Java Thread
我正在尝试停止Java线程运行6000毫秒。
下面的代码杀死线程R1未能停止线程。 您可以更正密码吗?
我已经用while(!Thread.currentThread()。isInterrupted())尝试了这段代码来停止线程。
import java.time.Duration;
import java.time.Instant;
class ThreadDemo extends Thread {
private Thread t;
private String threadName;
ThreadDemo(String name) {
threadName = name;
System.out.println("Creating " + threadName);
}
@Override
public void run() {
System.out.println("Running " + threadName);
try {
while (!Thread.currentThread().isInterrupted()) {
for (int i = 100; i > 0; i--) {
System.out.println("Thread: " + threadName + ", " + i);
// Let the thread sleep for a while.
Thread.sleep(600);
}
}
} catch (InterruptedException e) {
System.out.println("Thread " + threadName + " interrupted.");
Thread.currentThread().interrupt();
}
System.out.println("Thread " + threadName + " exiting.");
}
@Override
public void start() {
System.out.println("Starting " + threadName);
if (t == null) {
t = new Thread(this, threadName);
t.start();
}
}
}
public class Killthread {
public static void main(String args[]) throws InterruptedException {
Instant timeBefore = Instant.now();
ThreadDemo R1 = new ThreadDemo("Thread-1");
R1.start();
System.out.println("Afte thread start");
Thread.sleep(6001);
Instant timeAfter = Instant.now();
if (Duration.between(timeBefore, timeAfter).toMillis() > 6000) {
R1.interrupt();
// R1.stop();
System.out.println("Thread Interrupted due to Time limitation.");
}
}
}
您的代码中有两个问题,首先是您没有使主线程休眠足够长的时间,其次您正在中断错误的线程。
6001
ms的时间不足以保证您的持续时间检查正确。 当我运行您的代码时,main方法很少进入if块。 如果将其更改为睡眠6100
ms,则它应始终调用中断。
第二个问题是您要中断R1
,但需要中断t
。
如果您在ThreadDemo中重写interrupt()
将调用传递给t
,则它将接收该中断并中断其执行线程。
例如
@Override public void interrupt() {
t.interrupt();
}
问题是,您在ThreadDemo::start
启动了一个全新的,不同的和不必要的线程。
@Override
public void start() {
System.out.println("Starting " + threadName);
if (t == null) {
t = new Thread(this, threadName);
t.start();
}
}
它应该看起来像
@Override
public void start() {
System.out.println("Starting " + threadName);
super.start();
}
并摆脱该private Thread t;
在ThreadDemo
。
为了从您覆盖的启动方法中调用t.start(),请调用super.start(),它将调用线程类的start(),并负责创建新线程并将其注册到线程调度程序中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.