暂停线程

本节介绍两个被废弃的用于线程暂停和恢复的方法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暂停线程的更多相关文章

  1. Java如何暂停线程一段时间?

    在Java编程中,如何暂停线程一段时间? 以下示例显示如何通过创建sleepThread()方法来暂停线程一段时间. package com.yiibai; public class Suspendi ...

  2. 关于java中线程休眠的另一种写法

    编辑器加载中... 优先使用TimeUnit类中的sleep() TimeUnit是什么? TimeUnit是java.util.concurrent包下面的一个类,TimeUnit提供了可读性更好的 ...

  3. Java Thread线程控制

    一.线程和进程 进程是处于运行中的程序,具有一定的独立能力,进程是系统进行资源分配和调度的一个独立单位. 进程特征: A.独立性:进程是系统中独立存在的实体,可以拥有自己独立的资源,每个进程都拥有自己 ...

  4. Java并发——线程安全、线程同步、线程通信

    线程安全 进程间"共享"对象 多个“写”线程同时访问对象. 例:Timer实例的num成员,即add()方法是用的次数.即Timer实例是资源对象. class TestSync ...

  5. java中线程机制

    java中线程机制,一开始我们都用的单线程.现在接触到多线程了. 多线性首先要解决的问题是:创建线程,怎么创建线程的问题: 1.线程的创建: 四种常用的实现方法 1.继承Thread. Thread是 ...

  6. Java中线程的yield(),sleep()以及wait()的区别

    从操作系统的角度讲,os会维护一个ready queue(就绪的线程队列).并且在某一时刻cpu只为ready queue中位于队列头部的线程服务. 但是当前正在被服务的线程可能觉得cpu的服务质量不 ...

  7. Java中线程的使用 (2)-多线程、线程优先级、线程睡眠、让步、阻塞

    Java中线程的使用 (2)-多线程.线程优先级.线程睡眠.让步.阻塞 (一)多线程使用方法 说明:创建每个新的线程,一定要记得启动每个新的线程(调用.start()方法) class Xc3 ext ...

  8. Java之线程,常用方法,线程同步,死锁

    1, 线程的概念 进程与线程 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.(进程是资源分配的最小单位) 线程:同一类线程共享代码和数据 ...

  9. java thread 线程锁同步,锁,通信

    12.线程同步 当多个线程访问同一个数据时,非常容易出现线程安全问题.这时候就需要用线程同步 Case:银行取钱问题,有以下步骤: A.用户输入账户.密码,系统判断是否登录成功 B.用户输入取款金额 ...

随机推荐

  1. sql 用表组织数据

    一.四种完整性约束 1.实体完整性约束:不允许出现相同记录的数据 2.域完整性约束:对字段进行限定,不得插入不符合限定的数据 3.引用完整性:表与表之间的关系 4.自定义完整性约束:开发人员自己设定对 ...

  2. Windows环境下Zookeeper的安装和部署(单机模式和伪集群模式)

    第一部分:单机模式 1)下载地址:http://www.pirbot.com/mirrors/apache/zookeeper/,建议下载stable版本 2)解压缩 将下载好的压缩包解压到指定目录, ...

  3. Java程序如何限速(控制下载和上传速度)

    转自 http://www.blogjava.net/canvas/articles/bandwidthlimiter.html 这里简单的讨论一下java设计网络程序中如何控制上传和下载速度,我们常 ...

  4. linux下配置服务自动启动

    1.切换到/etc/rc.d/init.d目录下 2.新建脚本,step.sh 3.添加开机启动   chkconfig –add step.sh 4.chkconfig step.sh

  5. 服务安全-IAM:百科

    ylbtech-服务安全-IAM:百科 IAM(身份识别与访问管理(简称大4A)) IAM(Identity and Access Management 的缩写),即“身份识别与访问管理”,具有单点登 ...

  6. java代码实现将集合中的重复元素去掉

    package com.loaderman.test; import java.util.ArrayList; import java.util.LinkedHashSet; import java. ...

  7. 能否保证service不被杀死?

    Service设置成START_STICKY kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样 提升service优先级 在AndroidManifest.xml文件中对于in ...

  8. Ceph 客户端的 RPM 包升级问题

    问题 最近想把一个现有的 Ceph 客户端升级为最新的 M 版: [root@overcloud-ovscompute-0 ~]# rpm -qa | grep ceph puppet-ceph-2. ...

  9. Hibernate5 Guide

    (1) 创建Maven工程 可以使用Eclipse或IDEA创建 (2) 修改pom文件 <project xmlns="http://maven.apache.org/POM/4.0 ...

  10. 007. Reverse Integer

    题目链接:https://leetcode.com/problems/reverse-integer/description/ Given a 32-bit signed integer, rever ...