线程的启动暂停和终止,听起来很简单,不过经常有初学者在这个问题上卡住,经常是启动了,能暂停,但再要启动就不行了,其实这个问题比较容易解决,思路也很简单,就是在启动线程的时候用一个判断语句锁定整个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();

}

}

}

}

}

线程的启动暂停和终止相关推荐

  1. tomcat线程循环异常终止_资深架构师带你从JVM层面了解线程的启动和停止

    文章简介 这一篇主要围绕线程状态控制相关的操作分析线程的原理,比如线程的中断,线程的通信等,内容比较多,可能会分两篇文章 内容导航 线程的启动的实现原理 线程停止的实现原理分析 为什么中断线程会抛出I ...

  2. Qt之线程的开始暂停恢复停止

    一.前言 软件开发中,使用到线程就不可避免的要实现线程的暂停恢复停止等操作,总不可能说线程一旦启动就直接运行到结束了,中途不能停止啥的.线程的开始以及结束都比较简单,都有对应的接口可以调用,线程的暂停 ...

  3. Jmeter配置之线程组启动和配置说明

    线程组启动和停止说明 线程组中包括setUp Thread Group.tearDown Thread Group.Thread Group: 如上图所示,这三者配置是一样的,区别在于setUp Th ...

  4. C++多线程之间,线程函数启动之后,多线程依赖的启动和线程唤醒操作。

    C++多线程之间,线程函数启动之后,线程间依赖的启动和唤醒操作 一.原理分析 1. 线程依赖关系 二. 实例分析 2.1 多线程启动 2.2 多线程模式讲解 (1) 多线程开启与主线程唤醒 (2)单线 ...

  5. python线程只能启动一次_python多线程只能运行一个线程的问题

    问题描述: 使用 python threading.Thread() 建立两个线程,启动后只有线程1在运行,线程2不运行. 问题代码 import time, threading def run_th ...

  6. 面试官:Java 线程如何启动的?

    摘要:Java 的线程创建和启动非常简单,但如果问一个线程是怎么启动起来的往往并不清楚,甚至不知道为什么启动时是调用start(),而不是调用run()方法呢? 本文分享自华为云社区<Threa ...

  7. 为何只能在其关联的线程内启动timer?

    为何只能在其关联的线程内启动timer? 在QTimer源码分析(以Windows下实现为例) 一文中,我们谈到: QTimer的是通过QObject的timerEvent()实现的,开启和关闭定时器 ...

  8. 宝塔面板部署nuxt项目线程守护启动以及Nginx反向代理

    宝塔面板部署nuxt项目 宝塔部署Vue,nuxt等项目需要是使用到node.jshe nginx才能实现部署.因此使用宝塔面板使用软件安装安装PM2管理器以及nginx代理软件 步骤一 新建文件夹上 ...

  9. Win32多线程 -- 线程控制(暂停/继续/终止)

    1. 关闭/终止 线程 BOOL TerminateThread(     HANDLE hThread,     DWORD dwExitCode    // 该线程的结束代码, GetExitCo ...

最新文章

  1. 几种Windows进程通信
  2. Python入门难吗?30年前的编程语言,为什么现在这么火?
  3. mysql数据清洗_mysql数据库如何实现亿级数据快速清理
  4. 龙芯2h芯片不能进入pmon_国产处理器龙芯地址空间详解
  5. 长连接和Keepalive详解
  6. androidrunnable使用_Android Runnable 运行在那个线程
  7. WPF——创建可观察的枚举器
  8. 媒体化战略:数字时代企业如何做好公关与内容营销
  9. C/C++中使用可变参数
  10. Linux_ubuntu16.04 无线/Wifi 上网速度慢的解决方法
  11. 【IOS账号分享】《魔女之泉4》
  12. 微信小程序获取后端数据
  13. PDF如何加水印? PDF加水印的方法
  14. 串联稳压电源与多谐振荡器
  15. python django企业固定资产管理系统pycharm项目源码lw
  16. SQL Server数据库的管理及维护
  17. 帮我写一份情书给在一起200天的女朋友,要求1000字
  18. 银行排队系统的设计与实现(源代码)
  19. 安卓9可用的性能监视器_监视应用程序生态系统的性能和可用性
  20. freemarker-2、模板字符串中的${}跟freemaker冲突的问题

热门文章

  1. 【PTA】【C语言】书香节
  2. 联合分析法(Python实现)
  3. Android基于红米系列手机读取本地图片路径失败的解决方案
  4. volatile限定符
  5. 基于Unity的2D小游戏 SpeedDown 开发笔记(学习bilibili@[M_Studio]的教学视频
  6. Python 内置模块tkinter —— 秒表计时器
  7. intel linux核显性能,Linux下调节屏幕亮度(Intel核显)
  8. Android x86 4.4-r1 PC正式版发布
  9. 写正则好用的测试工具
  10. 3D游戏设计作业(三)