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{ ...
随机推荐
- hdu-6701 Make Rounddog Happy
题目链接 Make Rounddog Happy Problem Description Rounddog always has an array a1,a2,⋯,an in his right po ...
- hdu-6621 K-th Closest Distance
题目链接 K-th Closest Distance Problem Description You have an array: a1, a2, , an and you must answer ...
- SPOJ - QTREE5 Query on a tree V 边分治
题目传送门 题意:给你一棵树, 然后树上的点都有颜色,且原来为黑,现在有2个操作,1 改变某个点的颜色, 2 询问树上的白点到u点的最短距离是多少. 题解: 这里用的还是边分治的方法. 把所有东西都抠 ...
- codeforces 761 C. Dasha and Password(多维dp)
题目链接:http://codeforces.com/contest/761/problem/C 题意:给出n行的字符串每一列都从第一个元素开始可以左右移动每一行字符串都是首位相连的. 最后问最少移动 ...
- Python字符串中删除特定字符
分析 在Python中,字符串是不可变的.所以无法直接删除字符串之间的特定字符. 所以想对字符串中字符进行操作的时候,需要将字符串转变为列表,列表是可变的,这样就可以实现对字符串中特定字符的操作. 1 ...
- 【Ehcache】基础知识学习
一.Ehcache概述 1.1 简介 1.2 Ehcache的主要特性 二.Ehcache使用介绍 2.1 Ehcache缓存过期策略 2.2 如何解决缓存与db不同步的问题. 三.Ehcache 基 ...
- 【Offer】[22] 【链表中倒数第k个结点】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路分析 采用双指针的方法,第一个指针首先向前移动k-1个位置,第二个指针指向头节点,然后将 ...
- 初玩Docker
Docker 和VM的区别 Docker就是类似于一个打包好的环境,相关的服务都安装在里面,可以直接使用的. VM就相当于另外一套独立的系统,独立的IP,虚拟硬件. 要使用就需要单独构建一套才可以. ...
- 【LeetCode】435-无重叠区间
题目描述 给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠. 注意: 可以认为区间的终点总是大于它的起点. 区间 [1,2] 和 [2,3] 的边界相互"接触", ...
- 【LeetCode】300-最长上升子序列
题目描述 给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 ...