• 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 释放锁

  • 相关阅读:
    最新Xcode7.x环境下上架iOS App到AppStore 完整流程
    rails提供的validators
    Ruby 符号【转】
    xaml学习笔记
    fedora安装rails缺少js runtime和cannot load such file -- sqlite3/sqlite3_native解决办法
    学习笔记——敏捷开发
    结队编程(电梯调度问题)
    【转】javascript操作Select标记中options集合
    【软件工程】Word frequency program
    【转】诗社之死
  • 原文地址:https://www.cnblogs.com/deltadeblog/p/9566781.html
Copyright © 2020-2023  润新知