Java线程方法destroy、stop、suspend、resume

428 阅读2分钟

原文日期:2016-08-02


destroy方法

该方法不支持,会抛出NoSuchMethodError异常。

stop方法

stop方法执行后,会立即释放当前锁,并且立即停止线程执行,可能完成数据不一致,或者数据损坏。

suspend和resume方法

这两个方法是成对出现。suspend并不会释放锁,必须调用该线程的resume方法才能唤醒线程,并且容易发生死锁。

  • 案例分析
package com.ctosb.sample;

public class ThreadMethod {

	public static void main(String[] args) throws InterruptedException {
//		stop();
		suspendAndResume();
	}

	public static void stop() {
		Thread thread = new Thread() {
			@Override
			public void run() {
				for(int i=0;i<1000;i++){
					System.out.println(i);
					try {
						Thread.sleep(20);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}

		};
		thread.start();
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		thread.stop();
	}
	
	public static void suspendAndResume() {
		Thread thread = new Thread("suspendAndResume") {
			@Override
			public void run() {
				for(int i=0;i<1000;i++) {
					System.out.println(i);//1
					try {
						Thread.sleep(20);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
			
		};
		thread.start();
		try {
			Thread.sleep(40);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		thread.suspend();
		System.out.println(1);//2
		thread.resume();
	}

}

stop方法分析: 该例子的stop方法,执行后将会在不定次数的循环后停止,for循环并不会完整结束。如果for循环里是在更新一个耗时的对象,那么在执行stop方法后,将会立即停止for循环处理,可能会导致数据损坏。

suspendAndResume方法分析: 程序如果正常执行的话是如下,suspend方法调用后只会暂停suspendAndResume线程,但并不会释放锁,然而之后主线程在打印一段语句后,就去唤醒suspendAndResume线程,之后程序应该正常结束。然而实际运行结果可能会发生死锁,如下通过jstack工具查看线程运行情况结果如下:suspendAndResume线程一直处于runable状态,main线程处于block状态。

在System.out.println方法中有sychronized同步语句块,也就是说打印语句需要同步加锁。设想如下场景:suspendAndResume线程在进入代码标记行//1,main线程调用suspendAndResume线程的暂停方法,这时suspendAndResume线程虽然暂停但还是持有打印方法的锁,之后main线程进入代码标记行//2由于得不到打印方法的锁而阻塞,这样之后的唤醒suspendAndResume线程语句将不能执行,导致死锁。