Java中定时器和线程的困难

Java中定时器和线程的困难,java,multithreading,timer,Java,Multithreading,Timer,两个线程开始。我想在2秒内中断第一个线程。 你能帮我弄明白我的计时器有什么错吗。它似乎没有中断线程 class ThreadTask extends TimerTask { @Override public void run() { firstThread.interrupt(); System.out.println("firstThread has been terminated."); } // run } // class Thr

两个线程开始。我想在2秒内中断第一个线程。 你能帮我弄明白我的计时器有什么错吗。它似乎没有中断线程

class ThreadTask extends TimerTask {

    @Override
    public void run() {
        firstThread.interrupt();
        System.out.println("firstThread has been terminated.");
    } // run
} // class ThreadTask

Timer timer = new Timer();
ThreadTask task = new ThreadTask();
timer.schedule(task, new Date().getTime() + 3000);

这种方法的使用似乎有错误

您正在使用:

公共无效计划(TimerTask任务,长延迟)计划 在指定延迟后执行的指定任务。参数: 任务-要计划的任务。延迟-任务之前的延迟(毫秒) 将被执行

如果使用当前时间+2秒,则线程将在~44年内停止工作

使用:


中断线程的示例代码

Thread.run()
方法中检查
Thread.currentThread().isInterrupted()

计时器
必须从
Thread.run()
方法启动,如果要在其开始执行3秒后中断它。

    import java.util.Timer;
import java.util.TimerTask;

public class ThreadTimer implements Runnable {

    /**
     * @param args
     */
    public static void main(String[] args) {
        new Thread(new ThreadTimer()).start();
    }

    @Override
    public void run() {
        Timer timer = new Timer();
        ThreadTask task = new ThreadTask(Thread.currentThread());
        timer.schedule(task, 3000);

        while (true) {
            if (Thread.currentThread().isInterrupted()) {
                break;
            }
            System.out.println(Math.random() * 1000);
            // do whatever you want to do here
        }
    }

}

class ThreadTask extends TimerTask {

    private Thread thread;

    public ThreadTask(Thread thread) {
        this.thread = thread;
    }

    @Override
    public void run() {
        thread.interrupt();
        System.out.println("Thread has been terminated.");
    } // run
} // class ThreadTask

如果上述代码不符合您的要求,则使用
ExecutorService.awaitTermination()
作为执行此操作的最佳选项

这里有一个

在哪里定义了“firstThread”?也许您只是没有正确处理中断。(请注意,中断是协作的,因此您的其他线程需要检查中断才能退出)。
    import java.util.Timer;
import java.util.TimerTask;

public class ThreadTimer implements Runnable {

    /**
     * @param args
     */
    public static void main(String[] args) {
        new Thread(new ThreadTimer()).start();
    }

    @Override
    public void run() {
        Timer timer = new Timer();
        ThreadTask task = new ThreadTask(Thread.currentThread());
        timer.schedule(task, 3000);

        while (true) {
            if (Thread.currentThread().isInterrupted()) {
                break;
            }
            System.out.println(Math.random() * 1000);
            // do whatever you want to do here
        }
    }

}

class ThreadTask extends TimerTask {

    private Thread thread;

    public ThreadTask(Thread thread) {
        this.thread = thread;
    }

    @Override
    public void run() {
        thread.interrupt();
        System.out.println("Thread has been terminated.");
    } // run
} // class ThreadTask