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

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

使用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();
	
		
			}
			
			
		}
		
		
		
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	

}

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页