亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java多線程中的ReentrantLock可中斷鎖詳細解讀

 更新時間:2023年12月14日 08:54:34   作者:Terisadeng  
這篇文章主要介紹了Java多線程中的ReentrantLock可中斷鎖詳細解讀,ReentrantLock中的lockInterruptibly()方法使得線程可以在被阻塞時響應中斷,比如一個線程t1通過lockInterruptibly()方法獲取到一個可重入鎖,并執(zhí)行一個長時間的任務,需要的朋友可以參考下

ReentrantLock可中斷鎖

ReentrantLock中的lockInterruptibly()方法使得線程可以在被阻塞時響應中斷,比如一個線程t1通過lockInterruptibly()方法獲取到一個可重入鎖,并執(zhí)行一個長時間的任務,另一個線程通過interrupt()方法就可以立刻打斷t1線程的執(zhí)行,來獲取t1持有的那個可重入鎖。而通過ReentrantLock的lock()方法或者Synchronized持有鎖的線程是不會響應其他線程的interrupt()方法的,直到該方法主動釋放鎖之后才會響應interrupt()方法。下面看一個示例:

package com.teriste.thread;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
/**
 * 測試ReentrantLock可中斷鎖的效果
 */
public class ThreadInteruptDemo {
    ReentrantLock lock1=new ReentrantLock();
    ReentrantLock lock2=new ReentrantLock();
    /**
     * ReentrantLock響應中斷
     * @throws Exception
     */
    public void exeInterupt() throws Exception{
        Thread t1=new Thread(new DemoThread(lock1,lock2));
        Thread t2=new Thread(new DemoThread(lock2,lock1));
        t1.start();
        t2.start();
        System.out.println(t1.getName()+"中斷");
        //主線程睡眠1秒,避免線程t1直接響應run方法中的睡眠中斷
        Thread.sleep(1000);
        t1.interrupt();
        //阻塞主線程,避免所有線程直接結束,影響死鎖效果
        Thread.sleep(10000);
    }
    Object syn1=new Object();
    Object syn2=new Object();
    /**
     * Synchronized響應中斷
     * @throws Exception
     */
    public void exeInteruptSyn() throws Exception{
        Thread t1=new Thread(new DemoThread1(syn1,syn2));
        Thread t2=new Thread(new DemoThread1(syn2,syn1));
        t1.start();
        t2.start();
        System.out.println(t1.getName()+"中斷");
        //主線程睡眠1秒,避免線程t1直接響應run方法中的睡眠中斷
        Thread.sleep(1000);
        t1.interrupt();
        //阻塞主線程,避免所有線程直接結束,影響死鎖效果
        Thread.sleep(100000);
    }
    /**
     * ReentrantLock實現死鎖
     */
    static class DemoThread implements Runnable{
        ReentrantLock lock1;
        ReentrantLock lock2;
        public DemoThread(ReentrantLock lock1,ReentrantLock lock2){
            this.lock1=lock1;
            this.lock2=lock2;
        }
        @Override
        public void run() {
            try {
                //可中斷的獲取鎖
                lock1.lockInterruptibly();
                //lock1.lock();
                //睡眠200毫秒,保證兩個線程分別已經獲取到兩個鎖,實現相互的鎖等待
                TimeUnit.MILLISECONDS.sleep(200);
                //lock2.lock();
                //可中斷的獲取鎖
                lock2.lockInterruptibly();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                lock1.unlock();
                lock2.unlock();
                System.out.println("線程"+Thread.currentThread().getName()+"正常結束");
            }
        }
    }
    /**
     * Synchronized實現死鎖
     */
    static class DemoThread1 implements Runnable{
        Object lock1;
        Object lock2;
        public DemoThread1(Object lock1,Object lock2){
            this.lock1=lock1;
            this.lock2=lock2;
        }
        @Override
        public void run() {
            try {
                synchronized (lock1){
                    //睡眠200毫秒,再獲取另一個鎖,
                    //保證兩個線程分別已經獲取到兩個鎖,實現相互的鎖等待
                    TimeUnit.MILLISECONDS.sleep(200);
                    synchronized (lock2){
                    }
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                System.out.println("線程"+Thread.currentThread().getName()+"正常結束");
            }
        }
    }
}

測試代碼:

package com.teriste.thread;
import org.junit.Test;
public class ThreadInteruptDemoTest {
    /**
     * 測試ReentrantLock響應中斷
     * @throws Exception
     */
    @Test
    public void exeInteruptTest() throws Exception{
        ThreadInteruptDemo demo=new ThreadInteruptDemo();
        demo.exeInterupt();
    }
    /**
     * 測試Synchronized響應中斷
     * @throws Exception
     */
    @Test
    public void exeInteruptSynTest() throws Exception{
        ThreadInteruptDemo demo=new ThreadInteruptDemo();
        demo.exeInteruptSyn();
    }
}

當執(zhí)行exeInteruptTest()方法時,可以看到線程t1立刻響應了主線程的interrupt()方法:

當執(zhí)行exeInteruptSynTest()方法時,可以看到t0線程并沒有響應中斷,兩個線程仍然處于相互等待鎖釋放的狀態(tài)。

到此這篇關于Java多線程中的ReentrantLock可中斷鎖詳細解讀的文章就介紹到這了,更多相關ReentrantLock可中斷鎖內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java8 Stream流逐行處理文本文件

    java8 Stream流逐行處理文本文件

    這篇文章主要介紹了java8 Stream流逐行處理文本文件的相關資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • Spring中XML schema擴展機制的深入講解

    Spring中XML schema擴展機制的深入講解

    這篇文章主要給大家介紹了關于Spring中XML schema擴展機制的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-09-09
  • java使用Memcached簡單教程

    java使用Memcached簡單教程

    本文主要記錄Memcached的一些基本使用和簡單的Monitor,大家參考使用吧
    2013-12-12
  • Spring中的@EnableScheduling定時任務注解

    Spring中的@EnableScheduling定時任務注解

    這篇文章主要介紹了Spring中的@EnableScheduling注解,@EnableScheduling是 Spring Framework 提供的一個注解,用于啟用 Spring 的定時任務功能,通過使用這個注解,可以在 Spring 應用程序中創(chuàng)建定時任務,需要的朋友可以參考下
    2024-01-01
  • 分布式任務調度xxl-job問題解決

    分布式任務調度xxl-job問題解決

    這篇文章主要為大家介紹了分布式任務調度xxl-job的問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多多多進步,早日升職加薪
    2022-03-03
  • Java中抽象類和接口的用法詳解

    Java中抽象類和接口的用法詳解

    這篇文章主要為大家詳細介紹了Java中抽象類和接口的使用,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-08-08
  • Spring6當中獲取Bean的四種方式小結

    Spring6當中獲取Bean的四種方式小結

    Spring 為Bean 的獲取提供了多種方式,通常包括4種方式,(也就是說在Spring中為Bean對象的創(chuàng)建準備了多種方案,目的是:更加靈活),本文將通過代碼示例詳細的給大家介紹了一下這四種方式,需要的朋友可以參考下
    2024-04-04
  • SpringBoot在容器中創(chuàng)建實例@Component和@bean有什么區(qū)別

    SpringBoot在容器中創(chuàng)建實例@Component和@bean有什么區(qū)別

    這篇文章主要介紹了SpringBoot在容器中創(chuàng)建實例@Component和@bean有什么區(qū)別,在Spring Boot中,@Component注解和@Bean注解都可以用于創(chuàng)建bean。它們的主要區(qū)別在于它們的作用范圍和創(chuàng)建方式
    2023-03-03
  • Spark調優(yōu)多線程并行處理任務實現方式

    Spark調優(yōu)多線程并行處理任務實現方式

    這篇文章主要介紹了Spark調優(yōu)多線程并行處理任務實現方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • SpringBoot中使用?POI的示例代碼

    SpringBoot中使用?POI的示例代碼

    這篇文章主要介紹了SpringBoot中使用POI的實例詳解,包括引入poi的jar包和創(chuàng)建excel的實例代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08

最新評論