java初入多線程10

線程阻塞工具類 :LockSupport

  • LockSupport 是一個(gè)非常實(shí)用的線程阻塞工具神年, 可以在線程內(nèi)任意位置闰蛔,讓線程阻塞。 這個(gè)類補(bǔ)充了 使用resume 導(dǎo)致線程無法繼續(xù)執(zhí)行的情況,和wait方法相比 ,不需要獲得某個(gè)對(duì)象的鎖 耻涛,也不會(huì)拋出 中斷異常。
public class LockSupportDemo {

    public static Object U = new Object() ;
    static ChangeObjectThread t1 = new ChangeObjectThread("t1");
    static ChangeObjectThread t2 = new ChangeObjectThread("t2");
    public static class ChangeObjectThread extends Thread{
        public ChangeObjectThread (String name){
            super.setName(name);
        }
        
        @Override
        public void run() {
            synchronized(U){
                System.out.println("in " + getName());
                LockSupport.park();
                
            }
        }
    }
    
    public static void main(String[] args) throws Exception {
        t1.start();
        Thread.sleep(100);
        t2.start();
        LockSupport.unpark(t1);
        LockSupport.unpark(t2);
        t1.join();
        t2.join();
    }
}
  • 在該代碼中瘟檩,我們使用的是方法park(),和unpark(); 該類為每個(gè)線程準(zhǔn)備了一個(gè)許可抹缕, 如果許可可用,那么park()函數(shù)就會(huì)立即返回墨辛,消費(fèi)掉這個(gè)許可卓研,。 如果許可不可用睹簇,就會(huì)發(fā)生阻塞奏赘。這個(gè)優(yōu)點(diǎn)是即使 unpark ()發(fā)生在park上 ,也能順利的保證park操作正確執(zhí)行带膀。
  • 除了有定時(shí)阻塞的功能之外志珍, park()還支持 中斷影響,但是與其他中斷函數(shù)不一樣橙垢,park()函數(shù) 不會(huì)拋出中斷異常垛叨, 只是默默返回。 但是我們可以用 Thread.interupted() 等方法獲得中斷標(biāo)記柜某。代碼演示如下......
public class LockSupportIntDemo {

    public static Object U = new Object() ;
    static ChangeObjectThread t1 = new ChangeObjectThread("t1");
    static ChangeObjectThread t2 = new ChangeObjectThread("t2");
    
    public static class ChangeObjectThread extends Thread{
        public ChangeObjectThread (String name){
            super.setName(name);
        }
        
        @Override
        public void run() {
            synchronized(U){
                System.out.println("in " + getName());
                LockSupport.park();
                if(Thread.interrupted()){
                    System.out.println(getName() + "被中斷了");
                }
            }
            System.out.println(getName() + "執(zhí)行結(jié)束了");
        }
    }

    public static void main(String[] args) throws Exception {
        t1.start();
        Thread.sleep(100);
        t2.start();
        t1.interrupt();
        LockSupport.unpark(t2);
    }
}
臨界

線程復(fù)用:線程池

  • 線程池是為了方便我們對(duì)創(chuàng)建的線程進(jìn)行復(fù)用嗽元。節(jié)約了創(chuàng)建和銷毀對(duì)象的時(shí)間。
線程池的使用
jdk 對(duì)線程池的使用喂击。
  1. jdk 提供了一套Executor 框架剂癌, 本質(zhì)就是線程池的使用。
Executor框架
  • 從圖中可以看到ThreadPoolExecutor 表示一個(gè)線程池翰绊, Executors 類則扮演者線程池工廠的角色佩谷。 通過Executors 可以獲得擁有特定功能的線程池旁壮。 我們?cè)趗ml圖上 ,可以看到Executor 接口 谐檀,我們通過該接口 讓Runnable 的對(duì)象可以被ThreadPoolExecutor 線程池調(diào)度抡谐。
  • Executor 框架提供了各種類型線程池。工廠方法如下:
  1. newFixedThreadPool(int nThreads); 該方法返回的是一個(gè)固定線程數(shù)量的線程池桐猬,該線程池的線程數(shù)量始終不變麦撵。 當(dāng)有新任務(wù)提交過來的時(shí)候 ,線程池中有空閑線程溃肪,則立即執(zhí)行免胃。若沒有 ,則會(huì)把新的任務(wù)放到一個(gè)隊(duì)列中惫撰。等待有空閑線程的時(shí)候就會(huì)執(zhí)行隊(duì)列中的任務(wù)羔沙。
  2. newSingleThreadExecutor(): 方法會(huì)返回一個(gè)只有一個(gè)線程的線程池。若多余一個(gè)任務(wù)被提交到該線程池厨钻。任務(wù)同樣會(huì)保存在任務(wù)隊(duì)列中撬碟,等待線程空閑,按照先入先出的順序 執(zhí)行隊(duì)列中的任務(wù)莉撇。
  3. newCachedThreadPool() 方法: 方法會(huì)返回一個(gè)根據(jù)實(shí)際情況調(diào)整線程數(shù)量的線程池呢蛤。線程池的里面的線程數(shù)量不確定。在任務(wù)提交過來的時(shí)候棍郎,若有空閑線程 則直接復(fù)用空閑線程其障,若所有線程都在使用,那么會(huì)創(chuàng)建新的線程處理任務(wù)涂佃。所有線程結(jié)束后励翼,將返回線程池進(jìn)行復(fù)用。
  4. newSingThreadScheduleExecutor(): 該方法會(huì)返回一個(gè)ScheduledExecutorService對(duì)象辜荠,線程池大小為1汽抚, 這個(gè)線程池是在給定任務(wù)時(shí)間執(zhí)行某任務(wù)的功能,或者是周期性執(zhí)行任務(wù)
  5. newSheduledThreadPool(): 方法會(huì)返回ScheduledExecutorService對(duì)象伯病,該線程池可以指定線程數(shù)量造烁。
  • 對(duì)計(jì)劃任務(wù)線程池的使用:newSheduledThreadPool():
  1. 主要方法如下 對(duì)該線程里面的設(shè)置。
/**下面兩種方法 會(huì)在給定時(shí)間進(jìn)行一次任務(wù)調(diào)度午笛。**/
    public ScheduledFuture<?> schedule(Runnable command,
       long delay, TimeUnit unit);

    public <V> ScheduledFuture<V> schedule(Callable<V> callable,    long delay, TimeUnit unit);
/*** 該方法是對(duì)任務(wù)周期性的調(diào)度  fixRate 是任務(wù)調(diào)度頻率是一致的**/
    public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,   long initialDelay,  long period, TimeUnit unit);
/***同樣 周期性的調(diào)度 FixedDelay 是在任務(wù)完成一周周期后 再經(jīng)過某個(gè)時(shí)間長度 才會(huì)執(zhí)行任務(wù)**/
    public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,long initialDelay,
 long delay,  TimeUnit unit);
//代碼演示如下:
public class ScheduledExecutorServiceDemo {

    
    public static void main(String[] args) {
        ScheduledExecutorService  service = Executors.newScheduledThreadPool(10);
        service.scheduleAtFixedRate(new Runnable() {
            
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                    System.out.println(System.currentTimeMillis() / 1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }, 0, 2, TimeUnit.SECONDS);
    }
}
每隔兩秒
  1. 還有一種情況如果任務(wù)執(zhí)行時(shí)間超過我們所規(guī)定的時(shí)間 惭蟋,會(huì)怎么樣,是聚集還是药磺? 答案就是 會(huì)持續(xù)的當(dāng)當(dāng)前任務(wù)執(zhí)行完成后立即執(zhí)行下面的任務(wù)告组,。還有一個(gè)如果任務(wù)出現(xiàn)異常癌佩,那么該任務(wù)會(huì)被中斷 后續(xù)的任務(wù)也會(huì)被中斷木缝,那么需要我們最好異常處理便锨。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市我碟,隨后出現(xiàn)的幾起案子鸿秆,更是在濱河造成了極大的恐慌,老刑警劉巖怎囚,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卿叽,死亡現(xiàn)場離奇詭異,居然都是意外死亡恳守,警方通過查閱死者的電腦和手機(jī)考婴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來催烘,“玉大人沥阱,你說我怎么就攤上這事∫寥海” “怎么了考杉?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長舰始。 經(jīng)常有香客問我崇棠,道長,這世上最難降的妖魔是什么丸卷? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任枕稀,我火速辦了婚禮,結(jié)果婚禮上谜嫉,老公的妹妹穿的比我還像新娘萎坷。我一直安慰自己,他們只是感情好沐兰,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布哆档。 她就那樣靜靜地躺著,像睡著了一般住闯。 火紅的嫁衣襯著肌膚如雪瓜浸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天寞秃,我揣著相機(jī)與錄音斟叼,去河邊找鬼偶惠。 笑死春寿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的忽孽。 我是一名探鬼主播绑改,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼谢床,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了厘线?” 一聲冷哼從身側(cè)響起识腿,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎造壮,沒想到半個(gè)月后渡讼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耳璧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年成箫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旨枯。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蹬昌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出攀隔,到底是詐尸還是另有隱情皂贩,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布昆汹,位于F島的核電站明刷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏满粗。R本人自食惡果不足惜遮精,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望败潦。 院中可真熱鬧本冲,春花似錦、人聲如沸劫扒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沟饥。三九已至添怔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贤旷,已是汗流浹背广料。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留幼驶,地道東北人艾杏。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像盅藻,于是被迫代替她去往敵國和親购桑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子畅铭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 博客鏈接:http://www.ideabuffer.cn/2017/04/04/深入理解Java線程池:Thre...
    閃電是只貓閱讀 15,838評(píng)論 15 133
  • 下面是我自己收集整理的Java線程相關(guān)的面試題,可以用它來好好準(zhǔn)備面試勃蜘。 參考文檔:-《Java核心技術(shù) 卷一》-...
    阿呆變Geek閱讀 14,757評(píng)論 14 507
  • 前言 使用線程池能夠提高線程的復(fù)用率硕噩,避免不必要的創(chuàng)建線程,能夠節(jié)約內(nèi)存空間和CPU運(yùn)行時(shí)間缭贡。除此之外用線程池作為...
    Mars_M閱讀 2,842評(píng)論 0 11
  • 鑒于一種共享理念而創(chuàng)立的餐廳炉擅,連接商戶端和用戶端。 想起來阳惹,一位朋友的關(guān)于早點(diǎn)的創(chuàng)業(yè)與這個(gè)項(xiàng)目有相似之處坑资。 朋友在...
    夏夢(mèng)之生涯閱讀 183評(píng)論 0 0
  • 第五章 天空是灰蒙蒙的,厚重的積云疊著穆端,空氣里透著悶熱的氣息袱贮。壓抑是給人最直觀的感覺。 周圍...
    阿攸閱讀 473評(píng)論 0 1