iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >详解Java多线程tryLock()方法使用
  • 277
分享到

详解Java多线程tryLock()方法使用

2024-04-02 19:04:59 277人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

tryLock(long time, TimeUnit unit) 的作用在给定等待时长内锁没有被另外的线程持有,并且当前线程也没有被中断,则获得该锁,通过该方法可以实现锁对象的限时

tryLock(long time, TimeUnit unit) 的作用在给定等待时长内没有被另外的线程持有,并且当前线程也没有被中断,则获得该锁,通过该方法可以实现锁对象的限时等待。


package com.wkcto.lock.reentrant;

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


public class Test07 {
    static class TimeLock implements Runnable{
        private static ReentrantLock lock = new ReentrantLock();    //定义锁对象

        @Override
        public void run() {
            try {
                if ( lock.tryLock(3, TimeUnit.SECONDS) ){       //获得锁返回true
                    System.out.println(Thread.currentThread().getName() + "获得锁,执行耗时任务");
//                    Thread.sleep(4000);         //假设Thread-0线程先持有锁,完成任务需要4秒钟,Thread-1线程尝试获得锁,Thread-1线程在3秒内还没有获得锁的话,Thread-1线程会放弃
                    Thread.sleep(2000);          //假设Thread-0线程先持有锁,完成任务需要2秒钟,Thread-1线程尝试获得锁,Thread-1线程会一直尝试,在它约定尝试的3秒内可以获得锁对象
                }else {         //没有获得锁
                    System.out.println(Thread.currentThread().getName() + "没有获得锁");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                if (lock.isHeldByCurrentThread()){
                    lock.unlock();
                }
            }
        }
    }

    public static void main(String[] args) {
        TimeLock timeLock = new TimeLock();

        Thread t1 = new Thread(timeLock);
        Thread t2 = new Thread(timeLock);
        t1.start();
        t2.start();
    }
}

tryLock()仅在调用时锁定未被其他线程持有的锁,如果调用方法时,锁对象对其他线程持有,则放弃,调用方法尝试获得没,如果该锁没有被其他线程占用则返回true表示锁定成功; 如果锁被其他线程占用则返回false,不等待。


package com.wkcto.lock.reentrant;

import java.util.concurrent.locks.ReentrantLock;


public class Test08 {
    static class Service{
        private ReentrantLock lock = new ReentrantLock();
        public void serviceMethod(){
            try {
                if (lock.tryLock()){
                    System.out.println(Thread.currentThread().getName() + "获得锁定");
                    Thread.sleep(3000);     //模拟执行任务的时长
                }else {
                    System.out.println(Thread.currentThread().getName() + "没有获得锁定");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                if (lock.isHeldByCurrentThread()){
                    lock.unlock();
                }
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Service service = new Service();
        Runnable r = new Runnable() {
            @Override
            public void run() {
                service.serviceMethod();
            }
        };

        Thread t1 = new Thread(r);
        t1.start();
        Thread.sleep(50);       //睡眠50毫秒,确保t1线程锁定
        Thread t2 = new Thread(r);
        t2.start();
    }
}

package com.wkcto.lock.reentrant;

import java.util.Random;
import java.util.concurrent.locks.ReentrantLock;


public class Test09 {
    static class  IntLock implements Runnable{
        private static ReentrantLock lock1 = new ReentrantLock();
        private static ReentrantLock lock2 = new ReentrantLock();
        private int lockNum;        //用于控制锁的顺序

        public IntLock(int lockNum) {
            this.lockNum = lockNum;
        }

        @Override
        public void run() {
            if ( lockNum % 2 == 0 ){    //偶数先锁1,再锁2
                while (true){
                    try {
                        if (lock1.tryLock()){
                            System.out.println(Thread.currentThread().getName() + "获得锁1, 还想获得锁2");
                            Thread.sleep(new Random().nextInt(100));

                            try {
                                if (lock2.tryLock()){
                                    System.out.println(Thread.currentThread().getName() + "同时获得锁1与锁2 ----完成任务了");
                                    return;         //结束run()方法执行,即当前线程结束
                                }
                            } finally {
                                if (lock2.isHeldByCurrentThread()){
                                    lock2.unlock();
                                }
                            }
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } finally {
                        if (lock1.isHeldByCurrentThread()){
                            lock1.unlock();
                        }
                    }
                }
            }else {     //奇数就先锁2,再锁1
                while (true){
                    try {
                        if (lock2.tryLock()){
                            System.out.println(Thread.currentThread().getName() + "获得锁2, 还想获得锁1");
                            Thread.sleep(new Random().nextInt(100));

                            try {
                                if (lock1.tryLock()){
                                    System.out.println(Thread.currentThread().getName() + "同时获得锁1与锁2 ----完成任务了");
                                    return;         //结束run()方法执行,即当前线程结束
                                }
                            } finally {
                                if (lock1.isHeldByCurrentThread()){
                                    lock1.unlock();
                                }
                            }
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } finally {
                        if (lock2.isHeldByCurrentThread()){
                            lock2.unlock();
                        }
                    }
                }
            }
        }
    }
    public static void main(String[] args) {
        IntLock intLock1 = new IntLock(11);
        IntLock intLock2 = new IntLock(22);
        Thread t1 = new Thread(intLock1);
        Thread t2 = new Thread(intLock2);
        t1.start();
        t2.start();
        //运行后,使用tryLock()尝试获得锁,不会傻傻的等待,通过循环不停的再次尝试,如果等待的时间足够长,线程总是会获得想要的资源
    }
}

到此这篇关于详解Java多线程tryLock()方法使用的文章就介绍到这了,更多相关Java tryLock()内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解Java多线程tryLock()方法使用

本文链接: https://www.lsjlt.com/news/155822.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解Java多线程tryLock()方法使用
    tryLock(long time, TimeUnit unit) 的作用在给定等待时长内锁没有被另外的线程持有,并且当前线程也没有被中断,则获得该锁,通过该方法可以实现锁对象的限时...
    99+
    2024-04-02
  • Ruby多线程库(Thread)使用方法详解
    Thread是Ruby的线程库,Thread库已经内置在Ruby中,但如果想要使用线程安全的Queue、Mutex以及条件变量等,则需要手动require 'thread&#...
    99+
    2024-04-02
  • Python多线程使用方法详细讲解
    目录一、简介二、线程模块三、使用 threading 模块创建线程四、线程同步五、线程优先级队列( Queue)1、queue队列2、队列queue公共方法3、其他六、Queue详细...
    99+
    2024-04-02
  • Ruby3多线程并行Ractor使用方法详解
    Ruby 3 Ractor官方手册:https://github.com/ruby/ruby/blob/master/doc/ractor.md 在Ruby3之前,使用Thread来...
    99+
    2024-04-02
  • python多线程方法详解
    处理多个数据和多文件时,使用for循环的速度非常慢,此时需要用多线程来加速运行进度,常用的模块为multiprocess和joblib,下面对两种包我常用的方法进行说明。 1、模块安...
    99+
    2024-04-02
  • Java多线程Thread类的使用详解
    目录1.创建一个线程2.start()方法与run()方法3.查看线程4.创建线程的各种方法4.1实现Runnable接口4.2使用匿名内部类4.3使用匿名内部类实现Runnable...
    99+
    2022-12-03
    Java多线程Thread Java Thread Java多线程
  • Java多线程并发FutureTask使用详解
    目录基本使用代码分析继承关系FutureRunnableFutureFutureTask状态属性内部类构造方法检索 FutureTask 状态取消操作计算结果立刻获取结果或异常run...
    99+
    2024-04-02
  • JAVA多线程中join()方法的使用方法
    虽然关于讨论线程join()方法的博客已经非常极其特别多了,但是前几天我有一个困惑却没有能够得到详细解释,就是当系统中正在运行多个线程时,join()到底是暂停了哪些线程,大部分博客...
    99+
    2024-04-02
  • Java多线程wait()和notify()方法详细图解
    目录一、线程间等待与唤醒机制二、等待方法wait()三、唤醒方法notify()四、关于wait和notify内部等待问题(重要)五、完整代码(仅供测试用)总结一、线程间等待与唤醒机...
    99+
    2022-11-13
    多线程wait notify 线程的wait和notify 线程notify和wait区别
  • java多线程之CyclicBarrier的使用方法
    java多线程之CyclicBarrier的使用方法public class CyclicBarrierTest { public static void main(String[] args) { ExecutorServi...
    99+
    2023-05-30
    java 多线程 cyclicbarrier
  • java多线程join方法怎么使用
    在Java中,join()方法是Thread类的一个方法,用于等待该线程完成执行。当在一个线程中调用另一个线程的join()方法时,当前线程会被阻塞,直到被调用的线程执行完毕。join()方法有两种使用方式:1. join():调用该方...
    99+
    2023-08-11
    java join
  • Java多线程Semaphore工具的使用详解
    目录Semaphore 是一种用于控制线程并发访问数的同步工具。它通过维护一定数量的许可证来限制对共享资源的访问。 许可证的数量就是可以同时访问共享资源的线程数目。 当一个线程需要访...
    99+
    2023-05-19
    Java 多线程 Java Semaphore
  • Java详解使用线程池处理任务方法
    什么是线程池? 线程池就是一个可以复用线程的技术。 不使用线程池的问题: 如果用户每发起一个请求,后台就创建一个新线程来处理,下次新任务来了又要创建新线程,而创建新线程的开销是很大的...
    99+
    2024-04-02
  • C#多线程用法详解
    目录一、基本概念1、进程2、线程二、多线程2.1System.Threading.Thread类2.2线程的常用属性2.2.1线程的标识符2.2.2线程的优先级别2.2.3线程的状态...
    99+
    2024-04-02
  • Java多线程异步调用性能调优方法详解
    目录概述同步调用和异步调用Future类图Future的不足代码代码地址TestPaymentServiceCheckServiceOrderService总结概述 大型电商公司的支...
    99+
    2024-04-02
  • Java实现多线程同步五种方法详解
    Java实现多线程同步的五种方法包括:1. synchronized关键字:使用synchronized关键字可以实现对共享资源的互...
    99+
    2023-08-14
    Java
  • java中多线程与线程池的基本使用方法
    目录前言继承Thread 实现Runnale接口Callable线程池常见的4种线程池。总结前言 在java中,如果每个请求到达就创建一个新线程,开销是相当大的。在实际使用中,服务器...
    99+
    2024-04-02
  • Java使用线程池实现socket编程的方法详解
    目录前言一、一个简单的C/S模型实现1.服务器:2.客户端:二、线程池使用方法1.新建一个线程池2.用Runnable接口实现线程3.创建线程对象并提交至线程池执行三、结合起来四、使...
    99+
    2024-04-02
  • JAVA多线程详解(超详细)
    目录 一、线程简介1、进程、线程2、并发、并行、串行3、进程的三态 二、线程实现1、继承Thread类2、实现Runnable接口3、实现Callable接口(不常用) 三、线程常用方法1、线程的状态2、线程常用方法 四...
    99+
    2023-08-19
    java jvm 开发语言
  • Java多线程之线程状态详解
    目录 线程状态停止线程线程休眠模拟网络延迟(放大问题的发生性)模拟计时线程礼让插队(线程强制执行)线程状态观测线程优先级守护线程总结 线程状态 五个状态:新生、就...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作