java lock 锁

需要手动释放锁

boolean   lock.tryLock(long time, TimeUtil util);  尝试申请锁并持续 time , 申请到返回 true

void lock.lockInterruptibly() throws InterruptedException;  持续申请锁,效果等同与lock.lock(),但是lockInterruptibly() 可以在主线程取消等待,取消等待后会抛出异常。

package com.iweb;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Created by zh on 2019/4/29.
 */
public class Rep {


    Lock lock = new ReentrantLock();
    volatile boolean stop = false;


    // 通过 lock 申请锁
    private void t1() {
        lock.lock();
        try {
            while(!stop) {
                TimeUnit.SECONDS.sleep(1);
                System.out.println(Thread.currentThread().getName());
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
    
   // 通过 lockInterruptibly 申请锁
    private void t2() {
        boolean l = false;
        try {
            lock.lockInterruptibly();
            l = true;
            while(!stop) {
                TimeUnit.SECONDS.sleep(1);
                System.out.println(Thread.currentThread().getName());
            }
            System.out.println(Thread.currentThread().getName() + " end");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            if (l)
                lock.unlock();
        }
    }

    
    
    public static void main(String[] args) {
        Rep r = new Rep();

        Thread t1 = new Thread(()->r.t1(), "t1");
        t1.start();


        Thread t2 = new Thread(()->r.t2(), "t2");
        t2.start();
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        t2.interrupt(); // 停止t2持续申请但 会抛异常
        r.stop = true; 
    }

}

运行结果 

发布了16 篇原创文章 · 获赞 3 · 访问量 4530

猜你喜欢

转载自blog.csdn.net/qq_29697901/article/details/90175924
今日推荐