为什么不用suspend而建议使用一个标识来指示线程应该挂起还是唤醒

原创 2018年04月15日 09:08:42

使用suspend的时候,目标线程会停下来,这时候还是没有释放之前持有的锁,仍然保持,其他的线程资源也就无法访问锁定资源,除非被挂起的线程恢复运行,对任何线程来说,它们想要恢复目标线程,但是同时也试图使用一个任何锁定的资源,这样就造成了死锁。所以使用一个标识来指示,如果线程应该挂起,那么就使用wait方法阻塞释放锁,如果应该恢复就使用notify唤醒重新启动线程。


例子:有两个线程,一个主线程,一个子线程,希望主线程循环10次后,再跳转到子线程循环10次,如此重复50次。看代码如下:


/**
 * 
 */
package com.te;

/**
 * @author 绝影
 *
 */
public class ThreadOrder {
	
	public boolean identify=true;//线程应该挂起还是恢复的标志符号

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		new ThreadOrder().init();

	}
	
	public void init() {
		
		new Thread(//子线程
				
				new Runnable() {
					
					public void run() {
						
						for(int i=0;i<50;i++) {//循环50次
							
						synchronized(ThreadOrder.class) {
							
							if(identify) {//指示当前线程是否该挂起
								try {
								ThreadOrder.class.wait();//挂起否则也会和主线程抢锁
								}catch(InterruptedException e) {
									e.printStackTrace();
								}
							}
								
								for(int i1=0;i1<10;i1++) {//循环十次
									
									System.out.println(Thread.currentThread().getName()+"子线程执行的第"+i1+"次");
									
								}
								
								identify=true;//该表标识位
								ThreadOrder.class.notify();
						
							
						}	
				
						}
					}
					
					
				}
				).start();
		
		
		for(int j=0;j<50;j++) {
			synchronized(ThreadOrder.class) {
			if(!identify) {
				try {
				ThreadOrder.class.wait();//主线程挂起让子线程执行,否则它们和子线程去抢锁
				}catch(InterruptedException e) {
					
					e.printStackTrace();
				}
	
			}
				
				for(int i1=0;i1<10;i1++) {//循环十次
					
					System.out.println(Thread.currentThread().getName()+"主线程执行的第"+i1+"次");
					
				}
				
				identify=false;//该表标识位
				ThreadOrder.class.notify();
	
		
			}
			
			
		}
		
		
		
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	

}

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37817685/article/details/79946372

如何正确的挂起一个线程(为什么suspend被弃用)

suspend在JDK1.5时被弃用,因为它经常导致线程死锁。suspend不会破坏对象,但是如果用suspend挂起一个持有一个锁的线程,那么该锁在恢复之前是不可以使用的,如果调用suspend方法...
  • a979724882
  • a979724882
  • 2015-12-19 00:40:07
  • 2083

windows线程挂起与唤醒,SuspendThread与ResumeThread的一些相关问题

总结一下,创建进程有好多种方法,            CreateThread:这个函数WIN32api函数,最好不要用这个函数,会造成一些错误(原因还是很深刻的)           AfxB...
  • h315444352
  • h315444352
  • 2014-03-25 20:24:29
  • 3864

Windows 多线程之 挂起线程(Suspend)和重新激活(Resume)

今天讲一下SuspendThread。首先来一下
  • zhaishengfu
  • zhaishengfu
  • 2014-05-12 09:27:43
  • 2052

C# 线程的挂起与唤醒 (AutoResetEvent,ManualResetEvent)

如果说C#和C++有什么不同,博主不得不说,对于异步的支持程度是C#的一一个伟大的进步。     其实早期的C++都没有异步,并发的概念。博主第一次使用C++创建异步程序的时候,是使用boost库的内...
  • zuoshengting
  • zuoshengting
  • 2017-07-02 19:51:29
  • 318

USB的挂起和唤醒(Suspend and Resume)

USB协议的第9章讲到USB可见设备状态[Universal Serial Bus Specification, Section 9.1.1, Pg 239],分为连接(Attached),上电(Po...
  • luckywang1103
  • luckywang1103
  • 2014-05-07 21:01:25
  • 1303

C++多线程编程——线程的挂起、唤醒与终止

C++多线程编程——线程的挂起、唤醒与终止 (2010-10-11 10:09:04) 转载▼ 标签: 杂谈 分类:Win32 在线程创建并运行...
  • ranjio_z
  • ranjio_z
  • 2016-02-05 13:17:38
  • 4061

为什么不使用suspend和stop方法

JDK1.0定义了stop和suspend方法: stop用来直接终止线程,suspend会阻塞线程直到另一个线程调用resume. stop和suspend都有一些共同的点:都试图专横的控制一个...
  • u012036312
  • u012036312
  • 2015-08-27 11:22:00
  • 1009

ubuntu 挂起后无法唤醒的解决办法

唉,今日到图书馆,一下就把电脑关上了,没有使用什么 poweroff 关机,直接让他挂起,然后突然发现不能唤醒了。于是我就直接关机,使用windows系统去查寻一下解决办法。然而有的解决办法并不完整。...
  • jlran
  • jlran
  • 2016-09-29 10:55:50
  • 6528

Linux 线程挂起与唤醒功能 实例

pthread_cond_wait 多线程的条件变量 条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条...
  • waldmer
  • waldmer
  • 2014-04-11 09:35:09
  • 6319

EZ-USB的挂起恢复机制:suspend-resume mechanism

首先,需要明白四个概念:挂起(suspend)、恢复(resume)、空闲(idle)和唤醒(wakeup)。...
  • molake10344
  • molake10344
  • 2015-08-14 13:43:56
  • 1280
收藏助手
不良信息举报
您举报文章:为什么不用suspend而建议使用一个标识来指示线程应该挂起还是唤醒
举报原因:
原因补充:

(最多只允许输入30个字)