java暂停线程
暂停线程
本节介绍两个被废弃的用于线程暂停和恢复的方法suspend()、resume()。主要探究废弃原因,强调线程的安全性。主要有两个原因
原因1:
suspend()、resume()使用不当,极易造成对公共的同步对象的独占,使其他线程无法访问同步对象
例如:
package foreverly.cn.chapter1;
public class SynchronizedObject {
synchronized public void printString() {
System.out.println("printString begin");
if (Thread.currentThread().getName().equals("a")) {
System.out.println("a线程永远suspend了");
Thread.currentThread().suspend();
}
System.out.println("end");
}
}
package foreverly.cn.chapter1;
import foreverly.cn.chapter1.SynchronizedObject;
public class Run {
public static void main(String[] args) {
try {
final SynchronizedObject object = new SynchronizedObject();
// 使用匿名类的方式创建thread1
// Thread thread1 = new Thread() {
// @Override
// public void run() {
// object.printString();
// }
// () ->{
// object.printString();
// }
// };
// 使用lambda表达式创建thread1
Thread thread1 =new Thread( () ->{
object.printString();
});
thread1.setName("a");
thread1.start();
Thread.sleep(1000);
// thread1.resume()
Thread thread2 = new Thread() {
@Override
public void run() {
System.out.println("能打印这句话,说明thread2 启动了,但进不了printString()方法,只能打印出一个printString begin。"
+ "原因是printString()方法被suspend暂停了");
object.printString();
// 下面的语句执行不了,因为printString()是 synchronized方法,当一个线程使用时其余线程必须等待;
// 当thread1执行printString()时被暂停,但thread1任掌握着printString()方法,thread2就必须
// 等待,所以下面的语句执行不了。
System.out.println("这里的就输出不了,因为object.printString();已经暂停了thread2");
}
};
thread2.start();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
输出:
printString begin
a线程永远suspend了
能打印这句话,说明thread2 启动了,但进不了printString()方法,只能打印出一个printString begin。原因是printString()方法被suspend暂停了
原因2:
容易出现因为线程的暂停而导致数据不同步的情况。
这个有点类似于stop(),
例如:
线程a负责更新用户名和密码,run方法时同步的(synchronized 声明),但是当线程a更新完用户名且未更新密码,此时CPU切换至线程b执行。线程b通过a.suspend()暂停了线程a,就会出现密码不同步的现象。
比较有意思的是我们常用的println方法,它的源码是
synchronized (this) {
print(x);
newLine();
}
也会可能产生不同步的问题。
java暂停线程的更多相关文章
- Java如何暂停线程一段时间?
在Java编程中,如何暂停线程一段时间? 以下示例显示如何通过创建sleepThread()方法来暂停线程一段时间. package com.yiibai; public class Suspendi ...
- 关于java中线程休眠的另一种写法
编辑器加载中... 优先使用TimeUnit类中的sleep() TimeUnit是什么? TimeUnit是java.util.concurrent包下面的一个类,TimeUnit提供了可读性更好的 ...
- Java Thread线程控制
一.线程和进程 进程是处于运行中的程序,具有一定的独立能力,进程是系统进行资源分配和调度的一个独立单位. 进程特征: A.独立性:进程是系统中独立存在的实体,可以拥有自己独立的资源,每个进程都拥有自己 ...
- Java并发——线程安全、线程同步、线程通信
线程安全 进程间"共享"对象 多个“写”线程同时访问对象. 例:Timer实例的num成员,即add()方法是用的次数.即Timer实例是资源对象. class TestSync ...
- java中线程机制
java中线程机制,一开始我们都用的单线程.现在接触到多线程了. 多线性首先要解决的问题是:创建线程,怎么创建线程的问题: 1.线程的创建: 四种常用的实现方法 1.继承Thread. Thread是 ...
- Java中线程的yield(),sleep()以及wait()的区别
从操作系统的角度讲,os会维护一个ready queue(就绪的线程队列).并且在某一时刻cpu只为ready queue中位于队列头部的线程服务. 但是当前正在被服务的线程可能觉得cpu的服务质量不 ...
- Java中线程的使用 (2)-多线程、线程优先级、线程睡眠、让步、阻塞
Java中线程的使用 (2)-多线程.线程优先级.线程睡眠.让步.阻塞 (一)多线程使用方法 说明:创建每个新的线程,一定要记得启动每个新的线程(调用.start()方法) class Xc3 ext ...
- Java之线程,常用方法,线程同步,死锁
1, 线程的概念 进程与线程 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.(进程是资源分配的最小单位) 线程:同一类线程共享代码和数据 ...
- java thread 线程锁同步,锁,通信
12.线程同步 当多个线程访问同一个数据时,非常容易出现线程安全问题.这时候就需要用线程同步 Case:银行取钱问题,有以下步骤: A.用户输入账户.密码,系统判断是否登录成功 B.用户输入取款金额 ...
随机推荐
- HDU 5335 Walk Out BFS 比较坑
H - H Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status ...
- JavaScript如何比较两个数组的内容是否相同
今天意外地发现JavaScript是不能用==或===操作符直接比较两个数组是否相等的. alert([]==[]); // false alert([]===[]); // false 以上两句代码 ...
- jQuery事件之自定义事件
其实事件的bind和unbind,都是为了自定义事件做准备. 语法: $(selector).trigger(type, data); 作用:在每一个匹配的元素上触发某类事件,它触发的是由bind() ...
- JQuery动画之淡入淡出动画
1. 淡入动画 1.1 不带参数的淡入动画 格式: $(selector).fadeIn(); 示例代码: <!doctype html> <html lang="en&q ...
- 一、MySQL一些简述
概述 数据库(database) : 保存有组织的数据的容器(通常是一个文件或一组文件). 主键(primary key): 唯一标识表中每行的这个列(或这组列)称为主键.主键用表示一个特定的行.没有 ...
- yum update 更新失败
1.yum安装东西的时候,老是报:There are unfinished transactions remaining. You might consider running yum-complet ...
- Centos 安装字体库 以及解决confluence 旧文档数据的乱码
首先,第一步我们需要执行以下的命令来安装字体管理工具: yum install -y fontconfig mkfontscale 然后我们到(Windows系统)“c:/windows/fonts ...
- Android 获取Bitmap方式
1.获得当前项目资源文件(assets)下图片 (1).获得图片数据流 private Bitmap getBotMapInfo() { Bitmap bitmap = null; try { Inp ...
- liunx服务器在本地可以访问但是外网访问不了
版权声明:本文为CSDN博主「tlytg456」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/tlytg/ar ...
- 阶段3 3.SpringMVC·_06.异常处理及拦截器_2 SpringMVC异常处理之演示程序异常
原来的index.jsp删除.新建一个 创建pages文件夹.再创建success.jsp页面 重新部署项目 把这个项目移除掉 加入新的项目 启动tomcat服务器 模拟异常 方法抛出异常给前端控制器 ...