java线程的暂停和恢复 suspend 和resume

    问题——昨天被问到了一个具体的问题,大体是这样的:一个构建工具,在构建过程当中,主要业务处理逻辑由不少的子线程去执行(嗯,大体是这个意思),而后如今客户提出了一个需求,就是要暂停构建,而是否暂停时另外一个子线程去配置文件或者数据库读的,而后就须要暂停或者恢复其余执行的线程。java

    首先想到的是将全部子线程放到线程组中去,方便管理,而后再每一个线程中去设置一个标志flag,来调用监视器对象的wait方法来暂停线程,可是立马就发现问题了
数据库

    

public void run() {
	synchronized (control) {
		while (true) {
			if(flag){
				try {
					control.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			doingSomething();
			//这里是这个线程处理业务逻辑的地方
			//可是若是在这里阻塞了,就没法到判断是否暂停的逻辑上去
			//因此这个暂停不是实时的
		}
	}
}

因此若是要调用wait和标志位的方法来中断线程的话,确定不是实时的,有可能业务已经处理完了,你的wait也就没有意义了。函数

可是wait 会释放对象的锁,可是suspend()方法不会释放所持有对象的锁(监视器),例如若是在doingSomething()中持有System.out对象的锁,而后其余线程想打印写什么,就会产生阻塞,最坏的结果就是死锁工具

Thread.suspend()方法是java调用系统方法挂起线程,一样resume()也是调用系统的方法恢复线程spa

因此想要作到实时暂停线程和恢复线程,就须要调用Thread的suspend()和resume()两个函数,可是要很好的分析业务逻辑中持有的对象,是否是其余未暂停线程也要访问的,避免引起死锁或者阻塞。线程

相关文章
相关标签/搜索