黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

Java多線程編程概述
Java多線程的安全問題
Java多線程同步
Java多線程間的通信
Java線程Lock
Java多線程管理
保障線程安全的設(shè)計(jì)技術(shù)
Java鎖的優(yōu)化及注意事項(xiàng)
Java多線程集合
【Java多線程】單例模式與多線程

Java多線程:lockInterruptibly()方法

lockInterruptibly() 方法的作用:如果當(dāng)前線程未被中斷則獲得鎖,如果當(dāng)前線程被中斷則出現(xiàn)異常。

package com.wkcto.lock.reentrant;

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

/**
 * lockInterruptibly() 方法的作用:如果當(dāng)前線程未被中斷則獲得鎖,如果當(dāng)前線程被中斷則出現(xiàn)異常.
 */
public class Test05 {
    static class Servier{
        private Lock lock = new ReentrantLock();        //定義鎖對象
        public void serviceMethod(){
            try {
//                lock.lock();        //獲得鎖定,即使調(diào)用了線程的interrupt()方法,也沒有真正的中斷線程
                lock.lockInterruptibly();   //如果線程被中斷了,不會(huì)獲得鎖,會(huì)產(chǎn)生異常
                System.out.println(Thread.currentThread().getName() + "-- begin lock");
                //執(zhí)行一段耗時(shí)的操作
                for (int i = 0; i < Integer.MAX_VALUE; i++) {
                    new StringBuilder();
                }
                System.out.println( Thread.currentThread().getName() + " -- end lock");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                System.out.println( Thread.currentThread().getName() + " ***** 釋放鎖");
                lock.unlock();      //釋放鎖
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Servier  s = new Servier();
        Runnable r = new Runnable() {
            @Override
            public void run() {
                s.serviceMethod();
            }
        };
        Thread t1 = new Thread(r);
        t1.start();

        Thread.sleep(50);
        Thread t2 = new Thread(r);
        t2.start();
        Thread.sleep(50);
        t2.interrupt();     //中斷t2線程
    }
}

對于synchronized內(nèi)部鎖來說,如果一個(gè)線程在等待鎖,只有兩個(gè)結(jié)果:要么該線程獲得鎖繼續(xù)執(zhí)行;要么就保持等待。

對于ReentrantLock可重入鎖來說,提供另外一種可能,在等待鎖的過程中,程序可以根據(jù)需要取消對鎖的請求。

package com.wkcto.lock.reentrant;

import com.wkcto.pipestream.Test2;

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

/**
 *  通過ReentrantLock鎖的lockInterruptibly()方法避免死鎖的產(chǎn)生
 */
public class Test06 {
    static  class  IntLock implements Runnable{
        //創(chuàng)建兩個(gè)ReentrantLock 鎖對象
        public static ReentrantLock lock1 = new ReentrantLock();
        public static ReentrantLock lock2 = new ReentrantLock();
        int lockNum;        //定義整數(shù)變量,決定使用哪個(gè)鎖

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

        @Override
        public void run() {
            try {
                if ( lockNum % 2 == 1){         //奇數(shù),先鎖1,再鎖2
                    lock1.lockInterruptibly();
                    System.out.println(Thread.currentThread().getName() + "獲得鎖1,還需要獲得鎖2");
                    Thread.sleep(new Random().nextInt(500));
                    lock2.lockInterruptibly();
                    System.out.println(Thread.currentThread().getName() + "同時(shí)獲得了鎖1與鎖2....");
                }else {     //偶數(shù),先鎖2,再鎖1
                    lock2.lockInterruptibly();
                    System.out.println(Thread.currentThread().getName() + "獲得鎖2,還需要獲得鎖1");
                    Thread.sleep(new Random().nextInt(500));
                    lock1.lockInterruptibly();
                    System.out.println(Thread.currentThread().getName() + "同時(shí)獲得了鎖1與鎖2....");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                if ( lock1.isHeldByCurrentThread())         //判斷當(dāng)前線程是否持有該鎖
                    lock1.unlock();
                if (lock2.isHeldByCurrentThread())
                    lock2.unlock();
                System.out.println( Thread.currentThread().getName() + "線程退出");
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        IntLock intLock1 = new IntLock(11);
        IntLock intLock2  = new IntLock(22);

        Thread t1 = new Thread(intLock1);
        Thread t2 = new Thread(intLock2);
        t1.start();
        t2.start();

        //在main線程,等待3000秒,如果還有線程沒有結(jié)束就中斷該線程
        Thread.sleep(3000);

        //可以中斷任何一個(gè)線程來解決死鎖, t2線程會(huì)放棄對鎖1的申請,同時(shí)釋放鎖2,  t1線程會(huì)完成它的任務(wù)
        if (t2.isAlive()){ t2.interrupt();}
    }
}
全部教程
主站蜘蛛池模板: 日本韩国欧美在线 | 精品视频在线视频 | 亚洲人成网男女大片在线播放 | 国产在线观看一区二区三区 | 国产丝袜护土调教在线视频 | 澳门一级特黄真人毛片 | 正品蓝导航永久福利在线视频 | 欧美国产日本精品一区二区三区 | 毛片免费在线观看 | 色视频免费网站 | 高h猛烈做哭bl壮汉受小说 | 97影院理论在线观看 | 5x性区m免费毛片视频看看 | 欧美在线一二三区 | 欧美日韩加勒比一区二区三区 | 夜色福利视频 | 国产精品高清一区二区三区 | 欧美成人亚洲高清在线观看 | 日韩成人精品在线 | 免费一级特黄欧美大片勹久久网 | 日韩精品一区二区三区免费观看 | 亚洲综合日韩在线亚洲欧美专区 | 日韩一级一欧美一级国产 | 国产成人精品免费久久久久 | 婷婷开心激情 | 精品哟哟哟国产在线观看不卡 | 天天操伊人 | 狠狠色噜噜狠狠狠合久 | 亚洲 欧美 另类中文字幕 | 在线天堂中文在线网 | 激情五月开心婷婷 | 一级免费黄色录像 | 黄色视屏在线免费观看 | 久久国产精品偷 | 老子影院午夜伦不卡不四虎卡 | 在线观看免费黄视频 | 又黄又爽又色的黄裸乳视频 | 欧美高清视频性播放 | 中文字幕日本精品一区二区三区 | 欧美白人最猛性xxxxx | 国产gav成人免费播放视频 |