Java 转换为ScheduledThreadPoolExecutor

Java 转换为ScheduledThreadPoolExecutor,java,multithreading,swing,executorservice,event-dispatch-thread,Java,Multithreading,Swing,Executorservice,Event Dispatch Thread,我仍然是Java的初学者,所以我对线程和并发性了解不多。但是,我希望能够使用ScheduledThreadPoolExecutor作为计时器,因为java.util.timer和TimerTask存在问题。我对线程的创建非常感兴趣,并且知道我将在几周内学习它们。但是,如果可能的话,有人能给我一个基本的例子,说明如何将当前使用util.timer的迷你测试程序转换为使用ScheduledThreadPoolExecutor的迷你测试程序吗 我想尽快完成这个例子,所以我没有太多的时间来学习线程-无论

我仍然是Java的初学者,所以我对线程和并发性了解不多。但是,我希望能够使用ScheduledThreadPoolExecutor作为计时器,因为java.util.timer和TimerTask存在问题。我对线程的创建非常感兴趣,并且知道我将在几周内学习它们。但是,如果可能的话,有人能给我一个基本的例子,说明如何将当前使用util.timer的迷你测试程序转换为使用ScheduledThreadPoolExecutor的迷你测试程序吗

我想尽快完成这个例子,所以我没有太多的时间来学习线程-无论我多么想。说到这里,请包括您认为java初学者应该知道的关于ScheduledThreadPoolExecutor的重要内容

示例程序

我已经做了一个快速的小例子来说明我在一个更大的程序中遇到的问题。这个程序应该做的是允许用户按下按钮启动计数器。然后,用户必须能够在需要时停止并重新启动计数器。在较大的程序中,计数器保持相等是至关重要的,因此我使用了 scheduleAtFixRate() 方法。初始延迟始终相同(在本例中为0)也很重要。 问题是(我相信您会看到),一旦计时器被取消,它就无法重新启动—我希望ScheduledThreadPoolExecutor能够解决这一问题

代码:


我经常使用这个类进行测试,所以可能会有额外的代码(我想我把它全部删除了)。

替换

Timer timer = new Timer();


顺便说一句,您不应该试图在另一个线程上更新GUI。相反,您必须向Swing GUI线程添加一个任务来执行该任务

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            textOut.setText("" + i++);
        }
    });

我觉得你是在要求为你写代码。。。在想要学习线程的薄薄伪装下,“我想尽快完成这个示例,这样我就没有太多时间学习线程了——不管我多么想学习。”通常学习示例不包含类似“it is vital that”这样的措辞。我希望没有人会这样想。我对编程充满热情,目前正在大学学习编程。如果我想让人们编写我的程序,我会把真实的代码放在示例中,而不是我制作的快速测试示例中。我会把真实的代码放在示例中,而不是我制作的快速测试示例中。一位专业人士永远不会编写“真实”代码,而是会发布一个快速测试示例来说明他/她的问题。我从来没有见过一个学生写过这样的话,比如我想尽快完成这个例子,或者它是至关重要的。对不起,至关重要,我的意思是我需要这个程序来完成我写的东西。我正在休假,几天后就要结束了,当我回到大学时,我将没有那么多时间来尝试像现在这样的项目。相反,我将编写分配给我的任何内容,因此我将利用这些平静的时间来增强我的Java知识。这就是为什么我想在回去之前尽快完成我正在编写的程序。尽管这样做会不断增加死线。我得到了
pool-##-thread-1
,他们从来没有清理过。我遗漏了什么吗?@kmort我想你完成后没有关机。没有。我没有那样做。我不太清楚如何启动,因为我在一个对话框的windowClosing()中启动了该操作,该对话框在我计划Runnable之后立即消失。这不好吗?(我是Java新手…@kmort它还不错,但是你需要决定什么时候不再需要它。当你不想让任务调用shutdown()再次运行时,你可以让它运行。好的,我现在明白了。我只需将对
ScheduledExecutorService服务的引用传递给Runnable,并在完成时调用
service.shutdown()
。谢谢你,彼得。干杯
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
class Task extends TimerTask
class Task implements Runnable
timer.scheduleAtFixedRate(new Task(), 0, 1000);
service.scheduleAtFixedRate(new Task(), 0, 1000, TimeUnit.MILLISECONDS);
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            textOut.setText("" + i++);
        }
    });