首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使多线程swing gui应用程序用两个按钮启动/停止线程

多线程Swing GUI应用程序可以通过两个按钮来启动和停止线程。以下是一种实现方式:

  1. 首先,创建一个继承自javax.swing.JFrame的主窗口类,用于显示GUI界面。
  2. 在主窗口类中,创建两个按钮,一个用于启动线程,另一个用于停止线程。可以使用javax.swing.JButton类来创建按钮,并使用javax.swing.JPanel类来容纳按钮。
  3. 创建一个继承自javax.swing.SwingWorker的线程类,用于执行耗时操作。SwingWorker类是一个抽象类,需要实现doInBackground()方法来执行耗时操作,并可以通过publish()方法来更新GUI界面。
  4. 在启动按钮的事件处理方法中,创建一个线程对象,并调用其execute()方法来启动线程。在线程的doInBackground()方法中,执行耗时操作,可以使用Thread.sleep()模拟耗时操作。
  5. 在停止按钮的事件处理方法中,调用线程对象的cancel()方法来停止线程。

下面是一个示例代码:

代码语言:txt
复制
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MultiThreadSwingApp extends JFrame {
    private JButton startButton;
    private JButton stopButton;
    private WorkerThread workerThread;

    public MultiThreadSwingApp() {
        setTitle("Multi-Thread Swing App");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300, 200);

        JPanel buttonPanel = new JPanel();
        startButton = new JButton("Start");
        stopButton = new JButton("Stop");
        buttonPanel.add(startButton);
        buttonPanel.add(stopButton);

        getContentPane().add(buttonPanel, BorderLayout.CENTER);

        startButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                startButton.setEnabled(false);
                stopButton.setEnabled(true);
                workerThread = new WorkerThread();
                workerThread.execute();
            }
        });

        stopButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                startButton.setEnabled(true);
                stopButton.setEnabled(false);
                workerThread.cancel(true);
            }
        });

        stopButton.setEnabled(false);
    }

    private class WorkerThread extends SwingWorker<Void, Void> {
        @Override
        protected Void doInBackground() throws Exception {
            // 执行耗时操作
            while (!isCancelled()) {
                // 模拟耗时操作
                Thread.sleep(1000);
                System.out.println("Working...");
            }
            return null;
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                MultiThreadSwingApp app = new MultiThreadSwingApp();
                app.setVisible(true);
            }
        });
    }
}

这个示例代码演示了如何创建一个多线程的Swing GUI应用程序,通过两个按钮来启动和停止线程。启动按钮点击后,会创建一个WorkerThread对象并调用其execute()方法来启动线程;停止按钮点击后,会调用WorkerThread对象的cancel()方法来停止线程。

这个示例中使用了javax.swing.SwingWorker类来实现多线程操作,并通过Thread.sleep()模拟耗时操作。在实际应用中,可以根据需求替换为真实的耗时操作。

腾讯云相关产品和产品介绍链接地址:

  • 云服务器(CVM):提供弹性计算能力,支持多种操作系统,适用于各种应用场景。
  • 云数据库 MySQL 版:提供稳定可靠的云端数据库服务,支持高可用、备份恢复等功能。
  • 云存储(COS):提供安全可靠的对象存储服务,适用于图片、音视频、文档等数据的存储和管理。
  • 云函数(SCF):提供事件驱动的无服务器计算服务,支持多种编程语言,可用于处理后台任务和事件触发的计算。
  • 人工智能:腾讯云提供多种人工智能服务,包括图像识别、语音识别、自然语言处理等。
  • 物联网(IoT):提供全面的物联网解决方案,包括设备接入、数据采集、远程控制等功能。
  • 区块链(BCBaaS):提供安全可信的区块链服务,支持快速部署和管理区块链网络。
  • 音视频处理:提供音视频上传、转码、播放等功能,适用于在线教育、直播等场景。

以上是一个完善且全面的答案,涵盖了多线程Swing GUI应用程序的实现方式以及相关的腾讯云产品和产品介绍链接地址。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

《Java 2 图形设计卷Ⅱ- SWING》第2章 Swing的基本知识

如果对此还不太明白,下面的两个应用程序将会有助于理解。图2-5所示的小应用程序有七个按钮,其中四个是重量AWT按钮,其他三个是Swing轻量按钮。...null,以便这些按钮可以显式地定位和确定大小,使这些按钮朴素重叠。...Swing线程不安全的另一个原因是由于获取和释放锁定及恢复状态所带来的开销。使用线程安全GUI工具包的所有应用程序(无论它们是否是多线程的)都必须付出同样的性能代价。  ...线程的使用增加了调试、测试、维护和扩展的困难度。例如,测试和维护等通常已经很艰苦的工作对于大多数多线程应用程序就更困难了,有时甚至是不可能的。  有些Swing组件方法确实支持多线程访问。...当多线程被引入到面向对象语言中以后,人们遇到的较困难的领域之一就是如何扩展线程安全的类。相比之下,Swing开发人员使用的单线程方法使得类很容易扩展。

2.5K20

Qt多线程创建

【为什么要用多线程?】 传统的图形用户界面应用程序都只有一个执行线程,并且一次只执行一个操作。如果用户从用户界面中调用一个比较耗时的操作,当该操作正在执行时,用户界面通常会冻结而不再响应。...这个问题可以用事件处理和多线程来解决。 【使用多线程有什么好处?】 提高应用程序的响应速度。...,但不推荐terminate(),因为terminate()不会立刻终止这个线程,该线程何时终止取决于操作系统的调度策略,也就是说,它可以随时停止线程执行而不给这个线程自我清空的机会。...否则,如果线程A没有运行,就把按钮刷新为表示可以运行的“Start A”,启动线程A,然后将A按钮刷新为“Stop A”。...setGeometry的前2个参数是相对于窗口的坐标位置,后两个参数是按钮的长宽。

1.3K51
  • Swing 的任务线程与 EDT 事件分发队列模型

    该方法运行在初始化或启动线程上。初始化线程读取程序参数并初始化一些对象。 在许多Swing程序中,该线程主要目的是启动程序的GUI。创建UI的点,也就是程序开始将控制权转交给UI时的点。...一旦GUI启动后,对大多数事件驱动的桌面程序,初始化线程的工作就结束了。...在EDT上执行耗时任务会使程序失去响应,这会使GUI事件阻塞在队列中得不到处理 4.3 耗时操作放在独立的任务线程 通过SwingWorker启动。...6 Swing 事件分发线程(EDT) Swing的事件队列就类似事件队列,仅单一消费者,即一个事件分发线程。 除非你的程序停止,否则EDT会永不间断地徘徊在处理请求与等待请求之间。...当应用程序线程需要更新GUI时,应使用此方法。 在下面的示例中,invokeLater调用将Runnable对象doHelloWorld排队在事件分配线程上,然后打印一条消息。

    1K21

    并发编程-到处都是线程

    如果把并发看作是“可选的”或者是“高级”的语言功能自然是极好的,但现实告诉我们几乎所有的Java应用程序都是多线程的,而且这些框架并没有把你从适当的协同访问应用程序状态的需求中隔离出来。什么意思呢?...比如像servlets,RMI对象都应该为多次同时调用做好准备,并且必须提供他们自己的线程安全。 Swing and AWT。图形用户界面(GUI应用程序天生就是异步的。...用户会在任何时刻选择一个菜单选项或者按下一个按钮,而且他们希望应用程序马上就响应,即使这个时候应用程序正在投入的做一件其它事情,也要快速响应。...这个时候要想保证线程安全,替代方案就是,Swing的program会把所有对GUI组件的访问限制在事件线程中。...如果一个应用程序想要在事件线程外面来操作GUI,那么它就必须把操控GUI的代码放在事件线程中来运行。

    78970

    java多线程系列_线程简介(1)

    因此,在操作系统中运行的任何程序都至少有一个主线程。     进程和线程是现代操作系统中两个必不可少的运行模型。...如在GUI应用程序中,还以通过线程的异步特性来更好地处理事件;在应用服务器程序中可以通过建立多个线程来处理客户端的请求。...使GUI更有效率     使用单线程来处理GUI事件时,必须使用循环来对随时可能发生的GUI事件进行扫描,在循环内部除了扫描GUI事件外,还得来执行其他的程序代码。...在现代的GUI框架(如SWING、AWT和SWT)中都使用了一个单独的事件分派线程(event dispatch thread,EDT)来对GUI事件进行扫描。...当我们按下一个按钮时,按钮的单击事件函数会在这个事件分派线程中被调用。由于EDT的任务只是对GUI事件进行扫描,因此,这种方式对事件的反映是非常快的。     5.

    58620

    多线程

    比如,如果一个线程完成一个任务要100毫秒,那么十个线程完成改任务只需10毫秒。 2、线程和进程有什么区别?   线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。...如何分析和避免死锁?   死锁是指两个以上的线程永远阻塞的情况,这种情况产生至少需要两个以上的线程两个以上的资源。   分析死锁,我们需要查看Java应用程序线程转储。...很显然你可以将集合类分成两组,线程安全和非线程安全的。Vector 是同步方法来实现线程安全的, 而和它相似的ArrayList不是线程安全的。 9、Java中如何停止一个线程?   ...同步集合与并发集合都为多线程和并发提供了合适的线程安全的集合,不过并发集合的可扩展性更高。   在Java1.5之前程序员们只有同步集合来用且在多线程并发的时候会导致争,阻碍了系统的扩展性。   ...这两个方法是Swing API 提供给Java开发者用来从当前线程而不是事件派发线程更新GUI组件的。

    63870

    50道Java线程

    13) Java中如何停止一个线程? Java提供了很丰富的API但没有为停止线程提供API。...在多线程中有多种方法让线程按特定顺序执行,你可以线程类的join()方法在一个线程启动另一个线程,另外一个线程完成该线程继续执行。...当我们说swing不是线程安全的常 常提到它的组件,这些组件不能在多线程中进行修改,所有对GUI组件的更新都要在AWT线程中完成,而Swing提供了同步和异步两种回调方法来进行更 新。...这两个方法是Swing API 提供给Java开发者用来从当前线程而不是事件派发线程更新GUI组件的。...如果下一次你需要用到map,你应该首先想到ConcurrentHashMap。我的文章Java并发集合有更详细的说明。 51) 如何强制启动一个线程

    1.2K70

    50道Java线程

    13) Java中如何停止一个线程? Java提供了很丰富的API但没有为停止线程提供API。...在多线程中有多种方法让线程按特定顺序执行,你可以线程类的join()方法在一个线程启动另一个线程,另外一个线程完成该线程继续执行。...当我们说swing不是线程安全的常 常提到它的组件,这些组件不能在多线程中进行修改,所有对GUI组件的更新都要在AWT线程中完成,而Swing提供了同步和异步两种回调方法来进行更 新。...这两个方法是Swing API 提供给Java开发者用来从当前线程而不是事件派发线程更新GUI组件的。...如果下一次你需要用到map,你应该首先想到ConcurrentHashMap。我的文章Java并发集合有更详细的说明。 51) 如何强制启动一个线程

    1.6K110

    java多线程面试题大全_java多线程面试题_线程并发面试题

    比如,如果一个线程完成一个任务要100毫秒,那么十个线程完成改任务只需10毫秒。 2、线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。...如何分析和避免死锁? 死锁是指两个以上的线程永远阻塞的情况,这种情况产生至少需要两个以上的线程两个以上的资源。 分析死锁,我们需要查看Java应用程序线程转储。...很显然你可以将集合类分成两组,线程安全和非线程安全的。Vector 是同步方法来实现线程安全的, 而和它相似的ArrayList不是线程安全的。 9、Java中如何停止一个线程?...同步集合与并发集合都为多线程和并发提供了合适的线程安全的集合,不过并发集合的可扩展性更高。 在Java1.5之前程序员们只有同步集合来用且在多线程并发的时候会导致争,阻碍了系统的扩展性。...这两个方法是Swing API 提供给Java开发者用来从当前线程而不是事件派发线程更新GUI组件的。

    39630

    Java线程面试题 Top 50

    13) Java中如何停止一个线程? Java提供了很丰富的API但没有为停止线程提供API。...Java多线程中的死锁 死锁是指两个两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。...33) 有三个线程T1,T2,T3,怎么确保它们按顺序执行? 在多线程中有多种方法让线程按特定顺序执行,你可以线程类的join()方法在一个线程启动另一个线程,另外一个线程完成该线程继续执行。...当我们说swing不是线程安全的常常提到它的组件,这些组件不能在多线程中进行修改,所有对GUI组件的更新都要在AWT线程中完成,而Swing提供了同步和异步两种回调方法来进行更新。...这两个方法是Swing API 提供给Java开发者用来从当前线程而不是事件派发线程更新GUI组件的。

    1.1K20

    Java图形用户界面程序设计所需要使用的工具

    其中,GUI 以图形形式的窗体代表应用程序;在窗体、对话框等容器上添加菜单、按钮等标准图形元素,组成直观的用户界面; 程序的结果同样是图形形式输出。...GUI 程序在操作上往往借助鼠标、键盘发送命令、启动操作。正因为 GUI 既在视觉上给用户舒适的感觉,又使得操作简单,所以成为主流的程序用户界面。...因此,许多Java程序员更喜欢使用Swing,它是建立在AWT之上的高级GUI工具包。Swing提供了更丰富的组件和更高的性能,使得开发人员可以创建更复杂、更具交互性的GUI应用程序。...Swing 组件类和 javax.swing 包中的类,是两个不同的范畴。...Swing概述 实际使用 Java 开发图形界面程序时 ,很少使用 AWT 组件,绝大部分时候都是 Swing 组件开发的 。

    27810

    多线程面试50题(转)

    13) Java中如何停止一个线程?   Java提供了很丰富的API但没有为停止线程提供API。...在多线程中有多种方法让线程按特定顺序执行,你可以线程类的join()方法在一个线程启动另一个线程,另外一个线程完成该线程继续执行。...当我们说swing不是线程安全的常常提到它的组件,这些组件不能在多线程中进行修改,所有对GUI组件的更新都要在AWT线程中完成,而Swing提供了同步和异步两种回调方法来进行更新。...这两个方法是Swing API 提供给Java开发者用来从当前线程而不是事件派发线程更新GUI组件的。...如果下一次你需要用到map,你应该首先想到ConcurrentHashMap。我的文章Java并发集合有更详细的说明。 51) 如何强制启动一个线程

    30820

    QT pyside2 线程嵌套子线程 实现开始运行和停止运行

    前言 为什么要使用多线程 QT是一种流行的跨平台应用程序开发框架,而PySide2是QT的一个Python绑定库。在QT和PySide2中使用多线程的主要原因是为了提高应用程序的性能和响应能力。...使用多线程可以将耗时的任务分配给不同的线程,在后台并行执行,从而避免阻塞主线程,保持应用程序的流畅性和响应性。...当应用程序需要进行复杂的计算、网络请求、文件读写或其他需要较长时间的操作时,使用多线程可以防止这些操作对用户界面的阻塞,使用户能够继续与应用程序进行交互。...总而言之,使用多线程可以提高QT PySide2应用程序的性能、响应能力和并发性,但需要注意线程安全和数据同步的问题。...---- 提示:以下是本篇文章正文内容,下面案例可供参考 一、单个线程实现按钮方法的执行 实现效果:界面不会卡顿、可以继续与应用程序进行交互; 开始执行、停止执行思路 当点击开始按钮时,分配一个线程a

    82910

    一文读懂《Java并发编程实战》:第1章 多线程安全性与风险

    如果是两个线程同时写同一个内存,在操作完成后将会是什么结果呢?是第一个线程写入的值?还是第二个线程写入的值?还是两个线程写入的一个混合值?...主要是GUI应用程序,例如:AWT 和 Swing 等,采用事件分发线程(Event Dispatch Thread,EDT)替代主事件循环。...多线程的风险 Java 对多线程的支持是一把双刃剑,既简化了并发应用程序的开发,也提高对开发人员的技术要求。 多线程的风险主要体现在3个方面: 安全性问题:“永远不发生糟糕的事情”。...JVM与Java框架对多线程的支持 几乎所有Java应用程序都是多线程的,当 JVM 启动时,它将为 JVM 的 内部任务(如:垃圾收集、终结操作等)创建后台线程,并创建一个主线程运行 main 方法。...当 RMI 代码调用远程对象,这个调用会被哪个线程执行?这其实是在由 RMI 管理的线程中进行调用的,因此,它必须是线程安全的。 Swing 和 AWT:GUI 应用程序的异步性。

    22220

    2023 年你必须具备的 12 项 Java 开发人员技能...

    用于此目的的最佳 Java GUI 框架是 AWT、Swing、JavaFX、Apache Pivot 等。了解各种框架并选择最适合您的应用程序的框架是很有好处的。...在这里,我们对其中两个框架进行了说明。 AWT – Java AWT(抽象窗口工具包)是一个用于在 java 中开发 GUI 或基于窗口的应用程序的 API。...Swing – Java Swing教程是 Java 基础类 (JFC) 的一部分,用于创建基于窗口的应用程序。它建立在 AWT(抽象窗口工具包)API 之上,完全 java 编写。...8.Java并发模式 多线程和多任务编程范例是属于 Java 并发模式的设计模式。线程是程序内的顺序控制流。有时它被称为执行上下文或轻量级进程。...多线程——多线程程序包含两个或多个可以同时并行运行的部分。此类程序的每个部分称为线程,每个线程定义单独的执行路径。 多任务处理 ——同时执行多个任务称为多任务处理。

    60450

    18.1 线程

    多线程   java提供了并发机制,可以在程序中执行多个线程,每一个线程完成一个功能,并与其他线程并发执行,这种机制称为多线程。...当不再启动其他线程的时候,这个程序就是一个单线程程序,主方法线程启动由java虚拟机负责,程序员负责启动自己的线程。   ...在main方法中,使线程执行需要调用Thread类中start()方法,start()方法调用被覆盖的run()方法,如果不调用start()方法,线程永远不会启动,在主方法中没有调用start方法之前...18.4.3 线程的中断 以往有时候会使用stop()方法来停止当前进程,而现在不建议这么使用,现在提倡的是在run()方法中使用无限循环的形式,然后使用一个布尔型的标记控制循环的停止。...18.5 线程的优先级 每个线程都有自己的优先级,线程的优先级可以表明在程序中该线程的重要性,如果有很多线程处于就绪状态,系统会根据优先级决定首先使哪个线程进入就绪状态。

    66650

    Java线程面试题 Top 50

    13) Java中如何停止一个线程? Java提供了很丰富的API但没有为停止线程提供API。...在多线程中有多种方法让线程按特定顺序执行,你可以线程类的join()方法在一个线程启动另一个线程,另外一个线程完成该线程继续执行。...当我们说swing不是线程安全的常常提到它的组件,这些组件不能在多线程中进行修改,所有对GUI组件的更新都要在AWT线程中完成,而Swing提供了同步和异步两种回调方法来进行更新。...这两个方法是Swing API 提供给Java开发者用来从当前线程而不是事件派发线程更新GUI组件的。...如果下一次你需要用到map,你应该首先想到ConcurrentHashMap。我的文章Java并发集合有更详细的说明。 51) 如何强制启动一个线程

    1.1K20

    Python Qt GUI设计:QTimer计时器类、QThread多线程类和事件处理类(基础篇—8)

    目录 1、QTimer计时器类 2、QThread多线程类 3、事件处理类 ---- 一般情况下,应用程序都是单线程运行的,但是对于GUI程序来说,单线程有时候满足不了需求。...当窗口控件收到timeout信号后,它就会停止这个定时器。这是在图形用户界面中实现复杂工作的一个典型方法,随着技术的进步,多线程在越来越多的平台上被使用,最终QTimer对象会被线程所替代。...单击“开始"按钮启动定时器,并使"开始"按钮失效。单击“结束"按钮停止定时器,并使“结束"按钮失效。...QThread有started和finished信号,可以为这两个信号指定槽函数,在线程启动和结束时执行一段代码进行资源的初始化和释放操作。...数字面板,还有一个用于启动任务的按钮

    2.9K20

    JAVA实现贪吃蛇游戏

    快来和小伙伴们一起玩贪吃蛇吧兄弟们,(虽然编译器运行后的贪吃蛇是单机游戏,哈哈,但还是可以两个人轮流玩,比分数的)。 运用到的知识点: GUI:java实现窗体、Swing。...其实JAVA SwingGUI目前企业中已经不用了,主要是一些学校和培训机构用来教导学生写一些游戏、小项目,练练手的。 多线程:定时器、刷帧等。 注:代码来源b站的一个UP主:狂神。...游戏主启动类: import javax.swing.*; //游戏主启动类 public class startGame { public static void main(String...这是多线程里面的知识,有疑问的可以去看看我之前写的多线程的文章。...random.nextInt(34); foody=75+25*random.nextInt(24); score=0; } //绘制面板,我们游戏中的所有东西都是这个画笔来画

    71930
    领券