1 /**
2 * 线程的暂停、恢复和停止
3 * @author Administrator
4 *
5 */
6 public class ThreadControlDemo {
7 public static void main(String[] args) {
8 MyThread mt = new MyThread("MyThread");
9
10 try {
11 Thread.sleep(3000);
12 System.out.println("\nSuspending MyThread.");
13 mt.mySuspend();
14 Thread.sleep(3000);
15
16 System.out.println("\nResuming MyThread.");
17 mt.myResume();
18 Thread.sleep(3000);
19
20 System.out.println("\nSuspending MyThread again.");
21 mt.mySuspend();
22 Thread.sleep(3000);
23
24 System.out.println("\nResuming MyThread again.");
25 mt.myResume();
26 Thread.sleep(3000);
27
28 System.out.println("\nStopping MyThread.");
29 mt.myStop();
30
31 } catch (InterruptedException e) {
32 System.out.println("Main thread Interrupted");
33 }
34 }
35 }
36
37 class MyThread implements Runnable {
38 Thread thrd;
39 private volatile boolean suspended;//暂停
40 private volatile boolean stopped;
41
42 MyThread(String name){
43 thrd = new Thread(this, name);
44 suspended = false;
45 stopped = false;
46 thrd.start();
47 }
48 @Override
49 public void run() {
50 System.out.println(thrd.getName() + " starting.");
51 try {
52 for (int i = 0; i < 1000; i++) {
53 if (stopped) {
54 System.out.println("Stopping begin.(1):");
55 }
56 System.out.print(".");
57 Thread.sleep(300);
58 if (stopped) {
59 System.out.println("Stopping begin.(2):");
60 }
61 synchronized (this) {
62 while(suspended) wait();
63
64 //如果thread要停止,跳出循环,线程结束。
65 if (stopped) {
66 break;
67 }
68 }
69 }
70 } catch (InterruptedException e) {
71 System.out.println(thrd.getName() + " interrupted.");
72 }
73 System.out.println("\n" + thrd.getName() + " exiting.");
74 }
75
76 //调用方法停止线程
77 synchronized void myStop() {
78 stopped = true;
79
80 suspended = false;
81 notify();
82 }
83
84 //暂停线程
85 synchronized void mySuspend() {
86 suspended = true;
87 }
88
89 //恢复线程
90 synchronized void myResume(){
91 suspended = false;
92 notify();
93 }
94 }

结果:

MyThread starting.
..........
Suspending MyThread.

Resuming MyThread.
...........
Suspending MyThread again.

Resuming MyThread again.
...........
Stopping MyThread.
Stopping begin.(2):

MyThread exiting.

多线程编程<三>的更多相关文章

  1. [置顶] 曙光到来,我的新书《Android进阶之光》已出版

    独立博客版本请点击这里 由来 2016年我开始建立了自己的知识体系,所有的文章都是围绕着这个体系来写,随着这个体系的慢慢成长,开始有很多出版社联系我写书,因为比较看好电子工业出版社,就顺理成章的开始了 ...

  2. 《Android进阶之光》--注解与依赖注入框架

    No1: 标准注解: 1)@Override:覆写 2)@Deprecated:过时 3)@SuppressWarnings:取消警告 4)@SafeVarargs:申明使用了可变长度参数的方法 No ...

  3. 《Android进阶之光》--Material Design

    接上篇<Android进阶之光>--Android新特性 No1: 组件: 1)底部工作条-Bottom Sheets 2)卡片-Cards 3)提示框-Dialogs 4)菜单-Menu ...

  4. Android中的多线程编程(一)附源代码

    Android中多线程编程:Handler类.Runnable类.Thread类之概念分析 1.Handler类: Handler是谷歌封装的一种机制:能够用来更新UI以及消息的发送和处理.Handl ...

  5. 《Android进阶之光》--多线程编程

    No1: 实现多线程的3中方法 1)继承Thread,重写run()方法 2)实现Runnable接口,并实现该接口的run()方法 3)实现Callable接口,重写call()方法 public ...

  6. 《Android进阶之光》--网络编程与网络框架

    No1: Volley源码分析: Volley.newRequestQueue-> RequestQueue.start()-> CacheDispatcher.start()->C ...

  7. Android进阶(九)APP编程感想

    从初识Android到现在,在不断做APP(二维码.条形码扫描,彩票购买,火车票余票查询)的过程中,自己学会了很多东西.找时间整理了一下,总结如下: 其中,对于前两个APP,自己都是在他人已完成的基础 ...

  8. Android中的多线程编程

    问题 Android的UI也是线程不安全的,如果要更新应用程序里的UI元素,必须在主线程中进行,否则就会抛异常.比如用一个Button的onClick函数去更新界面上的元素,就会得到一个CalledF ...

  9. 《Android进阶之光》--Android新特性

    Android 5.0新特性 1)全新的Material Design设计风格 2)支持多种设备 3)全新的通知中心设计--按照优先级显示 4)支持64位ART虚拟机 5)多任务视窗Overview ...

  10. Android进阶之光-第1章-Android新特性-读书笔记

    第 1 章 Android 新特性 1.1 Android 5.0 新特性 1.1.1 Android 5.0 主要新特性 1. 全新的 Material Design 新风格 Material De ...

随机推荐

  1. kubernetes/k8s CSI分析-容器存储接口分析

    更多 k8s CSI 的分析,可以查看这篇博客kubernetes ceph-csi分析,以 ceph-csi 为例,做了详细的源码分析. 概述 kubernetes的设计初衷是支持可插拔架构,从而利 ...

  2. 分享一个自己画div的技巧

    分享一个自己画div的技巧 笔者是小白,前端不是很懂.现在想总结下自己画div布局的小技巧和思路. 先对着设计图把div给好好框选出来 我个人觉得这一步是很重要的,要先分析大局,再细节处理.一定要先决 ...

  3. ZYNQ Linux 移植:包含petalinux移植和手动移植debian9

    参考: https://electronut.in/workflow-for-using-linux-on-xilinx-zynq/ https://blog.csdn.net/m0_37545528 ...

  4. P5591 小猪佩奇学数学

    P5591 小猪佩奇学数学 知识点 二项式定理 \[(x+1)^n=\sum_{i=0}^n\binom nix^i \] 单位根反演 \[[n\mid k]=\frac 1n\sum_{i=0}^{ ...

  5. Java键盘获取数据

    java录入键盘数据,整型.浮点型.布尔型.字符串. 通过导入java.util.Scanner实现各类操作 import java.util.Scanner;//导入包 public class H ...

  6. Intouch 制作自定义登录弹窗

    在新的自动化项目中,因为业主对设计审美要求比较高,对Intouch自带脚本呼出登录窗体不满意,故而制作自定义登录弹窗来满足其审美需求.在寻求自控群前辈的经验下,将其整理成博客,供大家参考. 1.登录窗 ...

  7. 定时任务quartz

      pom引入 <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>qua ...

  8. idea创建普通Web项目lib目录无法输出,tomcat不报错问题

    idea创建普通Web项目lib目录无法输出,tomcat不报错问题 idea版本:2021.2 tomcat版本:9.0.50 项目结构 创建一个普普通通的web项目,目录结构大概就是这样 . ├─ ...

  9. HCNA Routing&Switching之STP基础

    前文我们了解了VLAN动态注册协议GVRP相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15113770.html:今天我们来讨论下二层环路和STP相 ...

  10. Vulhub-Mysql 身份认证绕过漏洞(CVE-2012-2122)

    前言 当连接MariaDB/MySQL时,输入的密码会与期望的正确密码比较,由于不正确的处理,会导致即便是memcmp()返回一个非零值,也会使MySQL认为两个密码是相同的.也就是说只要知道用户名, ...