停止或中断Java线程
如果java线程运行6000毫秒,我将尝试停止它 以下终止线程R1的代码无法停止线程。你能更正一下密码吗 我已使用while(!Thread.currentThread().isInterrupted())尝试此代码以停止线程停止或中断Java线程,java,multithreading,Java,Multithreading,如果java线程运行6000毫秒,我将尝试停止它 以下终止线程R1的代码无法停止线程。你能更正一下密码吗 我已使用while(!Thread.currentThread().isInterrupted())尝试此代码以停止线程 import java.time.Duration; import java.time.Instant; class ThreadDemo extends Thread { private Thread t; private String threadN
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
,则它将接收中断并中断其执行线程
e、 g
代码中有两个问题,第一个是主线程睡眠时间不够长,第二个是中断了错误的线程
6001
ms的长度不足以保证您的持续时间检查为真。当我运行代码时,main方法很少进入if块。如果您将其更改为睡眠时间6100
ms,则应始终调用中断
第二个问题是您正在中断R1
,但您需要中断t
如果在ThreadDemo中重写interrupt()
,将调用向下传递到t
,则它将接收中断并中断其执行线程
e、 g
问题是,您在
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();
}
然后去掉
私有线程t
在ThreadDemo
中,问题是您在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();
}
然后去掉
私有线程t代码>在ThreadDemo
中,请从重写的开始方法调用t.start()请从重写的开始方法调用t.start()代码看起来不错,但我还没有尝试过。您看到了什么结果?使用start()
方法发生了什么?您可以打印日志并调用super.start()
?我不认为有必要使用嵌套线程。代码看起来不错,尽管我还没有尝试过。您看到了什么结果?使用start()
方法发生了什么?您可以打印日志并调用super.start()
?我认为不需要嵌套线程。