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{ ...
随机推荐
- 多级树的深度遍历与广度遍历(Java实现)
目录 多级树的深度遍历与广度遍历 节点模型 深度优先遍历 广度优先遍历 多级树的深度遍历与广度遍历 深度优先遍历与广度优先遍历其实是属于图算法的一种,多级树可以看做是一种特殊的图,所以多级数的深/广遍 ...
- Docker搭建disconf环境,三部曲之二:本地快速构建disconf镜像
Docker下的disconf实战全文链接 <Docker搭建disconf环境,三部曲之一:极速搭建disconf>: <Docker搭建disconf环境,三部曲之二:本地快速构 ...
- JAVA集合框架包含的内容
Java集合框架提供了一套性能优良.使用方便的接口和类,他们位于java.util包中. Collection接口 主要有List.Set等实现类,Map接口主要有HashMap.TreeMap等实现 ...
- JSP官方文档(JavaServer Pages Specification)下载
找了好久,终于找到官网的下载地址了.这样,就可以用一手的文档资料了! 下载地址:http://download.oracle.com/otndocs/jcp/jsp-2_3-mrel2-spec/ s ...
- springmvc request foward 和 redirect
---恢复内容开始--- 最近在实现那个学生信息录入的时候,先是在添加学生的页面添加完,然后想直接调用Conroller层遍历学生的方法,我的意思就是在contoller一个方法怎么直接调用另外一个方 ...
- 定义一个Person类,其中包括:1.定义属性:姓名、年龄、民族作为成员变量。定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化。3.定义多个方法:分别显示相应的属性值,例如getName(){System.out.print("名称="+name+";"); }4.定义一个方法“成长”:实现年龄的增加,每执行一次年龄增加1
题目显示不全,完整题目描述: (1)定义一个Person类,其中包括:1.定义属性:姓名:年龄:民族作为成员变量.定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化.3.定义多个方法:分别显 ...
- prometheus告警模块alertmanager注意事项(QQ邮箱发送告警)
配置alertmanager的时候,都是根据网上的教程来配置的. 因为我是用QQ邮箱来发送告警的,所以alertmanager.yml的邮箱配置如下: global: resolve_timeout: ...
- MOOC C++笔记(二):类和对象基础
第二周:类和对象基础 面向对象程序设计的四个基本特点 抽象.封装.继承.多态. 面向对象程序设计的过程 1.从客观事物抽象出类 抽象出的事物带有成员函数与成员变量(类似于带函数的结构体) 成员变量和成 ...
- 跟我学SpringCloud | 第十九章:Spring Cloud 组件 Docker 化
前面的文章<跟我学SpringCloud | 第十八篇:微服务 Docker 化之基础环境>我们介绍了基础环境系统和 JRE 的容器化,这一节我们介绍 Spring Cloud 组件的容器 ...
- JAVA设计模式-动态代理(Proxy)源码分析
在文章:JAVA设计模式-动态代理(Proxy)示例及说明中,为动态代理设计模式举了一个小小的例子,那么这篇文章就来分析一下源码的实现. 一,Proxy.newProxyInstance方法 @Cal ...