线程之suspend和resume方法
来源:互联网 发布:餐厅排队叫号软件 编辑:程序博客网 时间:2024/05/16 08:44
suspend() 和 resume() 两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的 resume() 被调用,才能使得线程重新进入可执行状态。
suspend() 和 resume() 方法有很多缺点。下面将其缺点列举一二
1.当 suspend() 和 resume() 方法使用不当时极容易造成公共同步对象的独占,使其他线程无法访问公共对象资源。
写一个简单的列子直观说明该问题,如下:
package com.java; class PrintObject{ synchronized public void printString(){ System.out.println("begin"); if(Thread.currentThread().getName().equals("a")){ System.out.println("线程 a 被中断"); Thread.currentThread().suspend(); } if(Thread.currentThread().getName().equals("b")){ System.out.println("线程 b 运行"); } System.out.println("end"); } }public class java_test{ public static void main (String[] args){ try{ PrintObject pb = new PrintObject(); Thread thread1 = new Thread(){ @Override public void run(){ pb.printString(); } }; thread1.setName("a"); thread1.start(); thread1.sleep(1000); Thread thread2 = new Thread(){ @Override public void run(){ pb.printString(); } }; thread2.setName("b"); thread2.start(); }catch(InterruptedException e){ } }}
从上面的运行结果可以看到线程a 在printString函数中暂停了自己,而函数printString 又使用了同步锁(synchronized)
导致线程b无法执行函数printString。
2.当 suspend() 和 resume() 方法使用不当时也容易造成数据不同步的情况。我仍然来看一个列子:
package java_thread;class MyObject{ private String passWord = "a"; private String userName = "b"; public void setValue(String p, String u){ this.passWord = p; if(Thread.currentThread().getName().equals("a")){ System.out.println("线程 a 被中断"); Thread.currentThread().suspend(); } this.userName = u; } public void printObject(){ System.out.println("passWord :" + passWord); System.out.println("userName :" + userName); }}public class Thread_test { public static void main (String[] args){ try{ MyObject ob = new MyObject(); Thread thread1 = new Thread(){ @Override public void run(){ System.out.println("线程a 开始运行"); ob.setValue("11","22"); } }; thread1.setName("a"); thread1.start(); thread1.sleep(1000); Thread thread2 = new Thread(){ @Override public void run(){ System.out.println("线程b 开始运行"); ob.printObject(); } }; thread2.setName("b"); thread2.start(); }catch(InterruptedException e){ } }}
从上面的运行结果可以看出线程a在修改了passWord的值后自己暂停了,这时线程b去读取passWord 和userName时就会出现数据不同步的现象。
综上所诉,在使用suspend和resume方法时一定要格外注意,避免上述现象出现。
阅读全文
0 0
- 线程之suspend和resume方法
- Java中的线程Thread方法之---suspend()和resume()
- java 线程Thread方法之suspend()和resume()
- Java中的线程Thread方法之suspend()和resume()
- Java中的线程Thread方法之---suspend()和resume()
- 为什么线程会放弃Suspend和Resume方法
- 【多线程-Suspend()和Resume()方法】
- java 线程中suspend,resume方法独占
- Chapter 4 suspend和resume方法
- java中线程阻塞之sleep、suspend、join、wait、resume、notify方法解析(一)
- Windows 多线程之 挂起线程(Suspend)和重新激活(Resume)
- suspend和resume弊端
- 自己实现线程的start、suspend、resume、stop方法
- 为什么java线程不推荐调用stop,suspend,resume方法
- Java多线程之线程的挂起与恢复(Suspend/Resume)
- 停止(suspend)和唤醒(resume)线程
- java线程暂停与恢复suspend和resume
- suspend() 和 resume() 方法,notify()和wait()方法区别
- leetCode:Non-overlapping Intervals
- 连续第十一天总结
- Springboot项目使用Nginx 并配置 HTTPS
- [LeetCode]62. Unique Paths
- Bootstrap学习笔记-css组件Hello_yihao的博客
- 线程之suspend和resume方法
- Visual Studio Ultimate 2013 Update5 中文版/英文版 下载 CD-KEY
- Dlib库landmark算法解析(ERT 集成回归树)
- redis学习系列(八)--redis-RDB基础
- Spring项目处理异常
- Windows编程基础--第7节 来吧,VS 2010
- 连续第十二总结
- Nginx 配置从零开始
- maven assembly插件构建分发包