`

线程的启动,暂停和终止

阅读更多
线程的启动暂停和终止,听起来很简单,不过经常有初学者在这个问题上卡住,经常是启动了,能暂停,但再要启动就不行了,其实这个问题比较容易解决,思路也很简单,就是在启动线程的时候用一个判断语句锁定整个run()方法就可以了。

     并且如何停止java的线程一直是一个困恼我们开发多线程程序的一个问题。这个问题最终在Java5的java.util.concurrent中得到了回答:使用interrupt(),让线程在run方法中停止。
简介

在Java的多线程编程中,java.lang.Thread类型包含了一些列的方法start(), stop(), stop(Throwable) and suspend(), destroy() and resume()。通过这些方法,我们可以对线程进行方便的操作,但是这些方法中,只有start()方法得到了保留。

在Sun公司的一篇文章《Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 》中详细讲解了舍弃这些方法的原因。那么,我们究竟应该如何停止线程呢?

      下面是我在单线程中的启动,暂停,继续并重新开始运行线程的代码实现。

代码片段1

package Threadtest;

import java.awt.FlowLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JFrame;

/**

* 测试线程的中断,继续,中断,继续

*

* @author Administrator

*

*/

public class User extends JFrame {

public void init() {

this.setTitle("测试线程");

this.setLayout(new FlowLayout());

this.setSize(300, 500);

// 创建一个进度条对象

javax.swing.JProgressBar jpa = new javax.swing.JProgressBar();

jpa.setMaximum(600);// 设置最大度

jpa.setValue(0);

this.add(jpa);

final javax.swing.JLabel la = new javax.swing.JLabel("显示区");

this.add(la);

javax.swing.JButton bu1 = new javax.swing.JButton("开始");

this.add(bu1);

javax.swing.JButton bu2 = new javax.swing.JButton("停止");

this.add(bu2);

this.setVisible(true);

// 创建并启动后台线程:

final Worker worker = new Worker(la, jpa, bu1, bu2);

worker.start();

bu1.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

// 按钮上的标签应改为停止 OK

worker.changeState();

}

});

bu2.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

// 按钮上的标签应改为停止 OK

worker.stopState();

}

});

}

/**

* @param args

*/

public static void main(String[] args) {

User u = new User();

u.init();

}

}

代码片段2

package Threadtest;

import javax.swing.JButton;

import javax.swing.JProgressBar;

//1.继承Thread类

//2.重写run方法

public class Worker extends Thread {

private javax.swing.JLabel la;

private boolean isSleep = true;// 暂停标志

private javax.swing.JProgressBar jpa;

private javax.swing.JButton bu1;

private javax.swing.JButton bu2;

private boolean stop = true;

public Worker(javax.swing.JLabel la, JProgressBar jpa, JButton bu1,

JButton bu2) {

this.jpa = jpa;

this.la = la;

this.bu1 = bu1;

this.bu2 = bu2;

}

// 指示线程是否修改标签上的内容

public void changeState() {

isSleep = !isSleep;

bu1.setText("暂停");

}

public void stopState() {

stop = !stop;

}

// 线程的运行,是从run方法开始执行

// 当run方法执行完毕时,一个线程退出!

public void run() {

int count = 0;

while (true) {

if (stop) {

if (!isSleep) {

bu1.setText("开始");

count += 10;

jpa.setValue(count);

String s = "" + count;

la.setText(s);

}

try {

Thread.sleep(100);

if (count == 600) {

break;

}

} catch (Exception ef) {

ef.printStackTrace();

}

}

}

}

}
分享到:
评论

相关推荐

    python 线程的暂停, 恢复, 退出详解及实例

    这意味着一旦线程启动(即调用了`start()`方法),就只能等到线程内的目标函数完全执行完毕才能结束。这种情况下,线程处于“失控”状态,无法通过外部控制其生命周期。 #### 一、线程暂停与恢复 线程的暂停与恢复...

    C++ 线程暂停、继续

    在本项目"线程暂停、继续"中,我们将探讨如何在MFC(Microsoft Foundation Classes)框架下创建并管理线程,特别是关注线程的暂停、恢复和退出操作。 首先,我们要了解C++11中的`std::thread`类,它是用于创建新...

    c#,winfrom线程暂停,继续,停止dome

    这个项目的核心目标是教会开发者如何在WinForm界面中实现对后台线程的暂停、继续和停止操作。 首先,我们需要了解C#中的线程。线程是操作系统分配CPU时间的基本单位,一个进程可以拥有多个线程,这些线程可以在不同...

    线程暂停、开始、结束

    线程的生命周期包括新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、等待(Waiting)、超时等待(Timed Waiting)和终止(Terminated)七个状态。当线程被启动后,它将从新建状态进入就绪状态,...

    C#多线程并行管理,通过Task实现,可随时暂停,继续以及停止等

    本主题主要关注如何利用`Task`类来实现多线程并行控制,并且具备暂停、继续和停止任务的能力。`Task`是.NET Framework中的异步编程模型,它提供了对并发执行任务的强大支持。 首先,`Task`类是System.Threading....

    JAVA 线程中启动线程

    通过上述知识点,我们可以理解Java中线程启动的原理和机制,以及如何在实践中有效地利用多线程来优化程序的执行。在编写`test`这样的示例时,你可以创建并启动线程,测试各种线程控制和同步方法,从而加深对Java线程...

    线程--管理线程(使线程中止,暂停,挂起等)

    本文将深入探讨如何在C#中管理线程,包括线程的中止、暂停和挂起,以及相关的同步机制。 首先,让我们讨论线程的创建与启动。在C#中,可以使用`System.Threading.Thread`类来创建线程对象,然后通过调用`Start()`...

    线程的功能

    线程启动后,它将独立于主线程运行,直到完成指定的工作或者被中断。 2. **线程的暂停** 线程的暂停功能允许我们在运行过程中控制线程的执行状态。在某些情况下,可能需要暂停线程以避免资源冲突或进行调试。然而...

    MFC和Win32创建、暂停、删除线程例子

    下面将详细介绍如何使用MFC和Win32 API来创建、暂停以及删除线程,并在VS2017项目中实现线程对UI的操作。 首先,我们来看**创建线程**: 1. **MFC中的线程创建**:MFC通过`CWinThread`类来管理线程。你可以通过...

    易语言批量启动多线程源码

    4. **线程管理**:线程的生命周期管理包括线程的启动、暂停、恢复和终止。易语言提供了相应的命令来管理这些操作,如“启动线程”、“暂停线程”、“恢复线程”和“结束线程”。 5. **资源管理**:多线程环境下,...

    易语言线程暂停与继续

    线程暂停与继续系统结构:子程序1,挂起线程,恢复线程,创建线程,销毁线程, ======窗口程序集1 || ||------_按钮1_被单击 || ||------_按钮2_被单击 || ||------子程序1 || ||------_按钮3_被单击 || || =

    线程创建和管理

    线程管理包括线程的创建、启动、暂停、恢复和终止等操作。开发者需要根据实际情况选择合适的线程管理策略,以确保程序的正确性和性能。 例如,在一个服务器程序中,我们可以使用Thread类来创建一个独立的线程,该...

    易语言启动线程中的延时循环

    启动线程后,线程会独立于主线程运行,直到其完成预定的任务或者被系统终止。 "延时循环"则是在编程中用来控制执行节奏的一种技术。在易语言线程中,可能需要在特定条件下让线程暂停一段时间再继续执行,这就需要...

    c#多线程产生素数,可以暂停,开始,退出,恢复

    `Start()`用于启动线程,`Abort()`可以强制终止线程(但也有潜在风险,因为它可能在非安全点中断执行),而`Join()`则用于等待线程完成其工作。然而,对于暂停和恢复,通常需要一个信号机制,如前面提到的`...

    C#线程打开、暂停、关闭操作

    关闭线程也需谨慎,因为直接终止线程可能会导致资源泄漏和数据不一致。推荐的方式是通过共享信号量让线程自然结束。例如,使用`ManualResetEvent`: ```csharp ManualResetEvent stopEvent = new ...

    易语言多线程控制线程数量源码

    创建线程的基本步骤包括定义线程函数、创建线程对象和启动线程。线程函数通常包含需要并发执行的任务,而线程对象则代表了一个可以独立运行的代码段。 1. **线程函数定义**: 易语言中,线程函数需要通过`线程入口...

    线程——基本线程的应用和线程调用控件

    - 阻塞(Blocked):线程因等待资源或同步而暂停执行。 - 终止(Terminated):线程执行完成或被强制停止。 6. **线程通信与协作**: - 等待/通知(wait/notify)机制:用于线程间的同步,一个线程等待另一个...

    多线程框架通用多线程源码.zip

    这个压缩包中的"多线程5.e"文件很可能包含了一个完整的多线程创建和管理模块,可能包括了线程启动、暂停、恢复和销毁等操作的函数或过程。 线程的启动是多线程编程的第一步,通常涉及到一个入口函数,该函数定义了...

    C#多线程之线程控制详解

    需要注意的是,通过Thread.Abort()停止的线程无法直接通过Thread.Start()方法再次启动,必须重新创建一个线程启动。因此,在“开始按钮”事件中,需要重新定义线程。 ```csharp private void btn_Start_Click...

Global site tag (gtag.js) - Google Analytics