转换为 ScheduledThreadPoolExecutor

2023-11-27

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

我想尽快完成这个示例,所以我没有太多时间来学习线程 - 无论我多么想。话虽如此,请包括您认为 Java 初学者应该了解的有关 ScheduledThreadPoolExecutor 的重要内容。

示例程序

我做了一个快速的小例子来代表我在更大的程序中遇到的问题。该程序应该做的是允许用户按下按钮来启动计数器。然后,用户必须能够在他/她想要的时候停止和重新启动计数器。在较大的程序中,该计数器保持相等至关重要,因此我使用了 调度AtFixRate() 方法。同样重要的是初始延迟始终相同(在本例中为 0)。 问题(我相信您会看到)是,一旦计时器被取消,它就无法重新启动 - 我希望 ScheduledThreadPoolExecutor 能够解决这个问题。

code:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.TimerTask;
import java.util.Timer;

public class Tester extends JFrame {
    JButton push = new JButton("Push");
    static JTextArea textOut = new JTextArea();
    Timer timer = new Timer();
    boolean pushed = false;
    static int i = 1;

    public Tester() {
        super();
        add(push, BorderLayout.NORTH);
        add(textOut);
        push.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (!pushed) {
                    timer.scheduleAtFixedRate(new Task(), 0, 1000);
                    pushed = true;
                } else {
                    timer.cancel();
                    pushed = false;
                }
            }
        });
    }

    static class Task extends TimerTask {
        public void run() {
            textOut.setText("" + i++);
        }
    }

    public static void main(String[] args) {
        Tester a = new Tester();
        a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        a.pack();
        a.setVisible(true);
    }
}

我经常使用这个类进行测试,因此可能会有额外的代码(我想我将其全部删除)。


Replace

Timer timer = new Timer();

with

ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();

and

class Task extends TimerTask

with

class Task implements Runnable

and

timer.scheduleAtFixedRate(new Task(), 0, 1000);

with

service.scheduleAtFixedRate(new Task(), 0, 1000, TimeUnit.MILLISECONDS);

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

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            textOut.setText("" + i++);
        }
    });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

转换为 ScheduledThreadPoolExecutor 的相关文章

随机推荐

  • grep 双引号内的字符串

    尝试在我使用这个的时候 grep 双引号内的字符串 grep user file grep e 这将到达我需要的文件部分并突出显示双引号 但不会在双引号中给出刺痛 尝试这样做 cat aaaa foo bar base grep oP K
  • G++ 编译器:选项 -s 已过时并被忽略 C++

    我正在尝试使用 g 编译器 Mac OSX 上的 4 6 0 编译和剥离 C 中的一个非常简单的程序 但在编译时我收到警告 源代码 include local Cellar gcc 4 6 0 gcc include c 4 6 0 ios
  • boost::算法::包含

    我查看了模板定义 参数似乎需要跨范围和谓词的迭代器 我传入了一个 vector begin end 和一个 std string 谓词 但仍然遇到许多与许多 boost 库项目相关的编译时错误 我可以看一下 boost algorithm
  • 仅用于 API 的 SSL 证书还是客户需要它们?

    我有一个 RESTFul API 我想使用 SSL 证书来保护它的安全 如果我要获得一些 SSL 证书 我是否需要为每个使用 API 的 Web 客户端单独提供一个证书 或者 API 是否是唯一需要证书的东西 SSL 证书安装在托管 RES
  • 渲染资产部分

    我在Rails 3 1上使用Ruby 我想知道如何在JavaScript资产中呈现部分 我的目标是 in app assets javascript cart js coffee erb a add sth click gt random
  • 如何在 Android Studio 中针对消息“调用需要 API 级别 21(当前最小值为 16)”启用 lint 错误?

    我有一个方法叫做setImageTintList 这要求最小 API 为 21 但是 如果我在 gradle 中将最小 API 设置为 16 应用程序仍然会在没有任何警告的情况下构建 虽然有一条红线说 setImageTintList 调用
  • 特定 GIT 应用程序作为 PIP 包安装要求

    我有这个应用程序https github com staticdev django crud utils需要安装 django sorting 才能工作 但它不可能是原始的 django sorting 而是我制作的一个叉子 https g
  • Postgresql:连接被拒绝。检查主机名和端口是否正确以及邮局主管是否接受 TCP/IP 连接 [重复]

    这个问题在这里已经有答案了 我正在尝试连接 postgresql 但收到此错误 org postgresql util PSQLException Connection refused Check that the hostname and
  • 在 MySQL 中的特定列之后添加多个列

    我需要向表中添加多列 但要定位列after一个名为lastname 我已经尝试过这个 ALTER TABLE users ADD COLUMN count smallint 6 NOT NULL log varchar 12 NOT NUL
  • 捕获从 Postgresql 到 PHP 的错误

    我想使用 php 捕获并显示网页上查询的错误 以我选择的方式 所以代替下面的代码 result pg query connection query if result success else echo pg last error conn
  • 如何对两个数组进行相互关联的排序?

    我在 python 中制作原型 并使用 zip 函数来实现此目的 我不知道如何在 Java 中执行此操作 基本上我有两个列表 一个是names其中之一是data 并希望它们相互关联地排序 我的程序只处理一个列表 data 在本例中 但我使用
  • 无法向 Angular TypeScript 类 (FormGroup) 添加新方法

    我正在尝试向 Angular 的 FormGroup 类添加一个附加方法 该方法将设置组的状态 从服务器设置错误状态 我有以下代码form helper ts我的 Angular4 应用程序中的文件 import FormGroup fro
  • 使用 git-svn 克隆多个 SVN 项目

    我有一个大型 Java 应用程序 它分为多个项目 每个项目在 Subversion 存储库中都有自己的文件夹 如下所示 会计核心 trunk branches tags Common trunk branches tags 网络通用 tru
  • Material UI 的工具提示 - 自定义样式[重复]

    这个问题在这里已经有答案了 如何更改 Material UI 工具提示的背景颜色和颜色 我尝试如下 但它不起作用 import createMuiTheme from material ui core styles export const
  • 返回值的复制构造函数何时发生

    我有以下成员函数 Person ClassB DoSomethingAndReturnPerson RAIIMutex myLock m mutex return m person RAIIMutex是一个辅助类 它接收互斥体并将其锁定在构
  • (CSS?)消除浏览器在超链接图像周围的“选定”线?

    所附屏幕截图来自 OS X Firefox 3 请注意 中心选项卡 图像 周围有一条虚线 显然是因为它是最近选择的选项卡 有没有办法可以消除 CSS 或 JavaScript 中的这条虚线 嗯 免费图像托管服务减小了图像的大小 但是如果您能
  • ListView 子项中的图像

    如何为列表视图子项添加图像而不是文本 喜欢http i44 tinypic com 2mzz6s6 png 通常我添加字符串的方式如下 ListViewItem item new ListViewItem A item SubItems A
  • 插入符训练方法抱怨有问题;所有 RMSE 指标值均缺失

    在很多情况下 我在尝试安装时都会遇到此错误gbm or rpart模型 最后 我能够使用公开数据一致地重现它 我注意到使用 CV 或重复的 cv 时会发生此错误 当我不使用任何适合控件时 我不会收到此错误 有人可以解释一下为什么我总是犯错误
  • 如何使用 symPy 和 numPy 用符号替换矩阵

    我试图用方程中的两个符号代替它们各自的矩阵形式 我创建了一个换向器函数 它形成了我的表达式 t vS sy symbols t vS commutative False hS t vS eta myComm t hS dHs myComm
  • 转换为 ScheduledThreadPoolExecutor

    我还是Java的初学者 所以我对线程和并发还没有了解太多 但是 我希望能够使用 ScheduledThreadPoolExecutor 作为计时器 因为我在使用 java util Timer 和 TimerTask 时遇到问题 我对线程的