zoukankan      html  css  js  c++  java
  • Lock的lockInterruptibly()方法

    lockInterruptibly()方法能够中断等待获取锁的线程。当两个线程同时通过lock.lockInterruptibly()获取某个锁时,假若此时线程A获取到了锁,而线程B只有等待,那么对线程B调用threadB.interrupt()方法能够中断线程B的等待过程。

    示例:

    要执行doBussiness()中的代码首先需要得到锁lock,线程使用lockInterruptibly()方法获取锁。

    如下示例中,t0得到了锁,t1等待。在t1等待时,调用t1.interrupt(),中断t1的等待。

    public class LockTest {
    
        private Lock lock = new ReentrantLock();
    
        public void doBussiness() {
            String name = Thread.currentThread().getName();
    
            try {
                System.out.println(name + " 开始获取锁");
                lock.lockInterruptibly();
                System.out.println(name + " 得到锁");
                System.out.println(name + " 开工干活");
                for (int i=0; i<5; i++) {
                    Thread.sleep(1000);
                    System.out.println(name + " : " + i);
                }
            } catch (InterruptedException e) {
                System.out.println(name + " 被中断");
                System.out.println(name + " 做些别的事情");
            } finally {
                try {
                    lock.unlock();
                    System.out.println(name + " 释放锁");
                } catch (Exception e) {
                    System.out.println(name + " : 没有得到锁的线程运行结束");
                }
            }
        }
    
    
        public static void main(String[] args) throws InterruptedException {
    
            LockTest lockTest = new LockTest();
    
            Thread t0 = new Thread(
                    new Runnable() {
                        public void run() {
                            lockTest.doBussiness();
                        }
                    }
                    );
    
            Thread t1 = new Thread(
                    new Runnable() {
                        public void run() {
                            lockTest.doBussiness();
                        }
                    }
                    );
    
            // 启动线程t1
            t0.start();
            Thread.sleep(10);
            // 启动线程t2
            t1.start();
            Thread.sleep(100);
            // 线程t1没有得到锁,中断t1的等待
            t1.interrupt();
        }
    }

    运行结果:

    Thread-0 开始获取锁
    Thread-0 得到锁
    Thread-0 开工干活
    Thread-1 开始获取锁
    Thread-1 被中断
    Thread-1 做些别的事情
    Thread-1 : 没有得到锁的线程运行结束
    Thread-0 : 0
    Thread-0 : 1
    Thread-0 : 2
    Thread-0 : 3
    Thread-0 : 4
    Thread-0 释放锁

    如果使用lock()方法获取锁,线程不会被中断。

    lock.lockInterruptibly();

    改为

    lock.lock();

    运行结果如下:

    Thread-0 开始获取锁
    Thread-0 得到锁
    Thread-0 开工干活
    Thread-1 开始获取锁
    Thread-0 : 0
    Thread-0 : 1
    Thread-0 : 2
    Thread-0 : 3
    Thread-0 : 4
    Thread-1 得到锁
    Thread-1 开工干活
    Thread-1 被中断
    Thread-1 做些别的事情
    Thread-1 释放锁
    Thread-0 释放锁

  • 相关阅读:
    MD5
    第一阶段冲刺(十)
    团队作业进度报告
    第一阶段冲刺(九)
    团队作业进度报告
    第一阶段冲刺(八)
    第一阶段冲刺(七)
    团队作业进度报告
    第一阶段冲刺(六)
    团队作业进度报告
  • 原文地址:https://www.cnblogs.com/deltadeblog/p/9566781.html
Copyright © 2011-2022 走看看