Java多线程 错误的停止线程的方法-- 使用stop

错误的停止线程的方法-- 使用stop代码示例

public class StopThread implements Runnable{

    /**
     * 模拟 五个连队 每个连队10个人去领取武器
     */
    @Override
    public void run() {
        //5个连队
        for (int i = 1; i < 6; i++) {
            System.out.println("连队 "+ i+ "开始领取武器");

            //一个连队10个人
            for (int j = 0; j < 10; j++) {

                System.out.println(j);
                try {
                    Thread.sleep(300);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("连队 "+i+" 已经领取完毕 ! ");
        }
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new StopThread());
        thread.start();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
		//1s后, 使用stop 中断线程
        thread.stop();
    }
}

运行后 ,程序打印如下 . 如图所示, 使用stop 造成的后果就是一个连队还没领取完, 就停止了线程. 在实际业务中, 就可能会造成数据的丢失,造成经济损失.

关于stop的错误理论

关于stop的错误理论: 不使用stop是由于stop不会释放掉monitor的锁 ,会造成程序的卡死 .
根据oracle的官网, 可以看到stop其实是会释放掉所有的monitor锁的.

关于suspend与resume会带来的问题

suspend 会让一个线程挂起, 但是不会释放锁, 是带着锁的去阻塞一个线程的, 这样很容易造成死锁. 也可能其他线程需要这把锁去, 这也可能会造成死锁 .

已标记关键词 清除标记
相关推荐