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{ ...
随机推荐
- poj 3468 A Simple Problem with Integers(原来是一道简单的线段树区间修改用来练练splay)
题目链接:http://poj.org/problem?id=3468 题解:splay功能比线段树强大当然代价就是有些操作比线段树慢,这题用splay实现的比线段树慢上一倍.线段树用lazy标记差不 ...
- codeforces 454 E. Little Pony and Summer Sun Celebration(构造+思维)
题目链接:http://codeforces.com/contest/454/problem/E 题意:给出n个点和m条边,要求每一个点要走指定的奇数次或者是偶数次. 构造出一种走法. 题解:可能一开 ...
- 面试加分项-HashMap源码中这些常量的设计目的
前言 之前周会技术分享,一位同事讲解了HashMap的源码,涉及到一些常量设计的目的,本文将谈谈这些常量为何这样设计,希望大家有所收获. HashMap默认初始化大小为什么是1 << 4( ...
- framework7 picker 具体使用
官网地址:https://framework7.io/docs/picker.html#dom-events <meta charset="UTF-8"> <me ...
- Erlang模块erl翻译
命令: erl 概述: Erlang模拟器 描述: erl程序启动一个Erlang运行时系统.准确的信息是依赖于系统的(举例,erl是否是脚本或程序,其它程序调用). ...
- C# 表达式树遍历(二)
一.前言 上一篇我们对表达式树有了初步的认识,这里我们将对表达式树进行遍历,只有弄清楚了他的运行原理,我们才可以对他进行定制化修改. 表达式系列目录 C# 表达式树讲解(一) C# 表达式树遍历(二) ...
- FreeSql (十八)导航属性
导航属性是 FreeSql 的特色功能之一,可通过约定配置.或自定义配置对象间的关系. 导航属性有 OneToMany, ManyToOne, ManyToMany, OneToOne, Parent ...
- Net基础篇_学习笔记_第十一天_面向对象(构造函数)
VS封装字段快捷键: 提取方法 Ctrl+R,M 封装字段 Ctrl+R,E 提取接口 Ctrl+R,I. 构成函数: public Student() { Con ...
- Can't connect to MySQL server on 'localhost' (10038)
平台:win7 已经安装好数据库,但是 在连接MySQL数据库时发生问题: 经过一系列的资料查找后,得到结论MySQL没有启动 解决方法: 将MySQL加入到Windows的服务中.切换到MySQL安 ...
- composer 依赖的require安装与remove删除命令
安装:require composer require phpmailer/phpmailer 删除:remove composer remove phpmailer/phpmailer