Java 学习笔记之 Suspend和Resume
Suspend和Resume:
Suspend和Resume使用方法:
以下例子证明了线程确实被暂停了,而且还可以恢复成运行状态。
public class SuspendResumeThread extends Thread{
private long i = 0;
public long getI() {
return i;
}
public void setI(long i) {
this.i = i;
}
@Override
public void run() {
while(true){
i++;
}
}
}
public class ThreadRunMain {
public static void main(String[] args) {
testSuspendResumeThread();
}
public static void testSuspendResumeThread(){
try {
SuspendResumeThread srt = new SuspendResumeThread();
srt.start();
Thread.sleep(5000);
srt.suspend();
System.out.println("A= " + System.currentTimeMillis() + " i=" + srt.getI());
Thread.sleep(5000);
System.out.println("A= " + System.currentTimeMillis() + " i=" + srt.getI());
srt.resume();
Thread.sleep(5000);
srt.suspend();
System.out.println("A= " + System.currentTimeMillis() + " i=" + srt.getI());
Thread.sleep(5000);
System.out.println("A= " + System.currentTimeMillis() + " i=" + srt.getI());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果:

Suspend和Resume缺点1-独占:
public class SuspendResumeObject {
synchronized public void printString(){
System.out.println("begin");
if(Thread.currentThread().getName().equals("a")){
System.out.println("a thread will suspend.");
Thread.currentThread().suspend();
}
System.out.println("SuspendResumeObject end");
}
}
public class ThreadRunMain {
public static void main(String[] args) {
testSuspendResumeObject();
}
public static void testSuspendResumeObject(){
try {
final SuspendResumeObject object = new SuspendResumeObject();
Thread t = new Thread(){
@Override
public void run() {
object.printString();
}
};
t.setName("a");
t.start();
Thread.sleep(1000);
Thread t2 = new Thread(){
@Override
public void run() {
System.out.println("Thread 2 start, but can't enter printString()");
System.out.println("Because of printString() is blocked by thread a");
object.printString();
System.out.println("Thread 2 complete");
}
};
t2.start();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果:

public class SuspendResumePrintStreamIssue extends Thread{
private long i = 0;
@Override
public void run() {
while (true){
// try {
i++;
// Thread.sleep(1);
System.out.println(i);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
}
}
}
public class ThreadRunMain {
public static void main(String[] args) {
testSuspendResumePrintStreamIssue();
}
public static void testSuspendResumePrintStreamIssue(){
try {
SuspendResumePrintStreamIssue srpsi = new SuspendResumePrintStreamIssue();
srpsi.start();
Thread.sleep(1000);
srpsi.suspend();
System.out.println("Main end.");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果:


同样是独占,当程序运行到PrintStream对象println()方法内部停止时,同步锁未被释放。这导致main()方法中的System.out.println("Main end.");不能被执行。
Suspend和Resume缺点2-数据不一致:
public class SuspendResumeDataIssue {
private String userName = "1";
private String password = "11";
synchronized public void setValue(String u, String p){
this.userName = u;
if(Thread.currentThread().getName().equals("a")){
System.out.println("Thread a suspend.");
Thread.currentThread().suspend();
}
this.password = p;
}
public void printUserNamePassword(){
System.out.println(userName + " " + password);
}
}
public class ThreadRunMain {
public static void main(String[] args) {
testSuspendResumeDataIssue();
}
public static void testSuspendResumeDataIssue(){
try {
SuspendResumeDataIssue srdi = new SuspendResumeDataIssue();
Thread t1 = new Thread(){
@Override
public void run() {
srdi.setValue("a", "aa");
}
};
t1.setName("a");
t1.start();
Thread.sleep(500);
Thread t2 = new Thread(){
@Override
public void run() {
srdi.printUserNamePassword();
}
};
t2.start();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果:

Java 学习笔记之 Suspend和Resume的更多相关文章
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- 20145330第六周《Java学习笔记》
20145330第六周<Java学习笔记> . 这周算是很忙碌的一周.因为第六周陆续很多实验都开始进行,开始要准备和预习的科目日渐增多,对Java分配的时间不知不觉就减少了,然而第十和十一 ...
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- Java学习笔记-多线程-创建线程的方式
创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...
- 0035 Java学习笔记-注解
什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...
- Java学习笔记(04)
Java学习笔记(04) 如有不对或不足的地方,请给出建议,谢谢! 一.对象 面向对象的核心:找合适的对象做合适的事情 面向对象的编程思想:尽可能的用计算机语言来描述现实生活中的事物 面向对象:侧重于 ...
- 0032 Java学习笔记-类加载机制-初步
JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...
- 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用
垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
随机推荐
- CF 462 C. A Twisty Movement 分段想 线段树 或 dp
题意 有一个只包含1和2的序列,试翻转一个区间,使得结果中非连续非递减数列最长. 思路 一. 作出1的前缀计数和为cnt1,2的后缀计数和为cnt2, 由于要找出[1,1,1][2,2,2][1,1, ...
- ZOJ 3870 Team Formation 位运算 位异或用与运算做的
For an upcoming programming contest, Edward, the headmaster of Marjar University, is forming a two-m ...
- 弹幕制作canvas方法,文字直播和聊天
今天要做体育文字直播的项目,类似这样: 文字不断循环显示,我这里找到了一个网上的写法,分析后并贴在这里,并且封装成了jquery barrager方法,很是方便,分析了下原理,是刷新canvas 画布 ...
- CentOS7.6中mysql实践
cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) 使用:yum -y install mysql mysql-server 安装 ...
- Python 之父的解析器系列之六:给 PEG 语法添加动作
原题 | Adding Actions to a PEG Grammar 作者 | Guido van Rossum(Python之父) 译者 | 豌豆花下猫("Python猫"公 ...
- Linux OOM-killer(内存不足时kill高内存进程的策略)
OOM_killer是Linux自我保护的方式,当内存不足时不至于出现太严重问题,有点壮士断腕的意味 在kernel 2.6,内存不足将唤醒oom_killer,挑出/proc/<pid> ...
- android 之下拉刷新
一.概述 Android 下拉刷新几乎是每个应用都必带的功能, 并且现在下拉刷新第三方库也越来越多了,很方便就能实现该功能, 下面我介绍一下 自己常用的几个方法. 二.例子 第一种方式:就是集成Lis ...
- Winform中设置Dialog的显示位置居中
场景 点击按钮使窗体以Dialog的方式显示,即弹窗. //声明窗体对象 ChartOption chartOption = new ChartOption(); //显示Dialog chartOp ...
- Day 11 文件的权限
1.什么是权限? 我们可以把它理解为操作系统对用户能够执行的功能所设立的限制,主要用于约束用户能对系统所做的操作,以及内容访问的范围,或者说,权限是指某个特定的用户具有特定的系统资源使用权力.* 2. ...
- Rsync 服务部署与参数详解
Rsync 简介 rsync 是一款开源的.快速的.多功能的.可实现全量及增量的本地或远程数据同步备份的优秀工具.Rsync软件适用于unix/linux/windows等多种操作系统平台. 传统的 ...