停止或中断Java线程

停止或中断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

如果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
,则它将接收中断并中断其执行线程

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()
?我认为不需要嵌套线程。