java多线程---停止、暂停一个线程

1.使用线程的stop方法,但是这个方法已经被deprecated了,因为使用它会释放锁并停掉线程,但是会出现数据不一致以及重要资源不能正确释放的问题

2.使用interrupt方法:调用线程的这个方法会修改线程的中断标志位真,可以通过interrupted和isInterrupted这两个方法来判断线程是否已经被中断,区别是第一个方法在调用之后会把状态改为false,第二个方法则不会

使用interrupt方法来中断一个线程执行的代码实现如下:

package com.zcj.thread01;

public class StopThread {
    public static void main(String[] args) {
		Thread thread = new Thread(new Runnable01());
		thread.start();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		thread.interrupt();
	}
}

class Runnable01 implements Runnable{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		try{
			while(true){
			System.out.println("线程一直执行中");
			//有二种方式来中断线程的执行,不采取任何措施的话,线程会进行到执行完
			//第一种:使用抛出异常的办法
				if(Thread.currentThread().interrupted()){
					System.out.println("线程被中断了");
					throw new InterruptedException();
				}
			//第二种:使用return;但是一般推荐第一种
//				if(Thread.currentThread().interrupted()){
//					System.out.print("线程被中断了");
//					return;
//				}
			}
		}catch(InterruptedException e){
			e.printStackTrace();
			return;
		}
	}
	
}
3.暂停线程:已经废弃的suspend和resume方法

会出现独占的情况:因为即使使用suspend暂停了线程,但是线程并不会释放自身所占用的锁,这样会导致资源的独占,甚至会出现死锁的情况

会出现数据不一致的情况:一个线程修改了部分数据然后挂起,另外一个线程读取数据,但是这个可以使用共享资源的同步来解决

下面演示了死锁的情况:

package com.zcj.thread02;

public class DeathLock {
    private String lock1 ="lock1";
    private String lock2 ="lock2";
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		DeathLock death = new DeathLock();
        Thread thread01 = new Thread(death.new Runnable01());
        Thread thread02 = new Thread(death.new Runnable02());
        thread01.start();
        thread02.start();
        try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        thread01.resume();
        thread02.resume();
	}
	
	class Runnable01 implements Runnable{

		@Override
		public void run() {
			// TODO Auto-generated method stub
			synchronized(lock1){
				System.out.println("线程1获得了锁1");
				System.out.println("线程1暂停了");
				Thread.currentThread().suspend();
				System.out.println("线程1恢复了");
				synchronized(lock2){
					System.out.println("线程1获得了锁2");
					
					
				}
			}
		}
		
	}

	class Runnable02 implements Runnable{

		@Override
		public void run() {
			// TODO Auto-generated method stub
			synchronized(lock2){
				System.out.println("线程2获得了锁2");
				System.out.println("线程2暂停了");
				Thread.currentThread().suspend();
				System.out.println("线程2恢复了");
				synchronized(lock1){
					System.out.println("线程2获得了锁1");
					
					
				}
			}
		}
		
	}

}

线程1获得了锁1
线程1暂停了
线程2获得了锁2
线程2暂停了
线程2恢复了
线程1恢复了
从运行结果来看,这里发生了死锁,导致线程1不能获得2锁,线程2不能获得1锁



你可能感兴趣的:(Java)