繁体   English   中英

停止或中断Java线程

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM