摘要:線程是在進(jìn)程中獨(dú)立運(yùn)行的子任務(wù)。線程中斷狀態(tài)由該方法清除。測試線程對象是否已經(jīng)是中斷狀態(tài),但不清除狀態(tài)標(biāo)志。高優(yōu)先級(jí)的線程總數(shù)大部分先執(zhí)行完,但不代表高優(yōu)先級(jí)的線程全部先執(zhí)行完。當(dāng)進(jìn)程中不存在非守護(hù)線程了,則守護(hù)線程自動(dòng)銷毀。
進(jìn)程是受操作系統(tǒng)管理的基本運(yùn)行單元。
線程是在進(jìn)程中獨(dú)立運(yùn)行的子任務(wù)。使用多任務(wù)操作系統(tǒng)Windows后,可以最大限度地利用CPU的空閑時(shí)間來處理其他的任務(wù)。使用多線程可以,提高CPU利用率,也就是使用異步,線程被調(diào)用的時(shí)機(jī)是隨機(jī)的。
使用多線程技術(shù)時(shí),代碼的運(yùn)行結(jié)果與代碼執(zhí)行順序或調(diào)用是無關(guān)的。隨機(jī)性。
Thread.java類中的start()方法通知“線程規(guī)劃器”此線程已經(jīng)準(zhǔn)備就緒,等待調(diào)用線程對象的run()方法。執(zhí)行start()方法發(fā)順序不代表線程的啟動(dòng)的順序。
共享數(shù)據(jù)的情況就是多個(gè)線程可以訪問同一個(gè)變量,會(huì)出現(xiàn)線程不安全的問題。
synchronized可以在任意對象及方法上加鎖,而加鎖的這段代碼稱為“互斥區(qū)”或“臨界區(qū)”。
非線程安全主要是指多個(gè)線程對同一個(gè)對象中的同一個(gè)實(shí)例變量進(jìn)行操作時(shí),會(huì)出現(xiàn)值被改變,值不同的情況。
雖然println()方法在內(nèi)部是同步的,但i--的操作卻是在進(jìn)入println()之前發(fā)生的。
currentThread()方法可返回代碼段正在被哪個(gè)線程調(diào)用的信息。
大多數(shù)停止一個(gè)線程的操作使用Thread.interrupt()方法,但這個(gè)方法不會(huì)終止一個(gè)正在運(yùn)行的線程,需要加入一個(gè)判斷才可以完成線程的停止。
this.interrupted()測試當(dāng)前線程是否已經(jīng)中斷。當(dāng)前線程是指運(yùn)行this.interrupted()方法的線程。線程中斷狀態(tài)由該方法清除。
this.isInterrupted()測試線程是否已經(jīng)中斷。測試線程Thread對象是否已經(jīng)是中斷狀態(tài),但不清除狀態(tài)標(biāo)志。
能停止的線程——異常法
public class MyThread extends Thread{ @Override public void run() { // TODO Auto-generated method stub super.run(); try { for (int i = 0; i < 500000; i++) { if(this.isInterrupted()){ System.out.println("已經(jīng)是停止?fàn)顟B(tài)了!我要退出"); throw new InterruptedException(); } System.out.println("i="+(i+1)); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
public class Run { public static void main(String[] args) { try { MyThread myThread = new MyThread(); myThread.start(); Thread.sleep(2000); myThread.interrupt(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("end"); } }
如果在sleep狀態(tài)下停止某一線程,會(huì)進(jìn)入catch語句,并且清除停止?fàn)顟B(tài),使之變成false;
建議使用“拋異?!狈▉韺?shí)現(xiàn)線程的停止,因?yàn)樵赾atch塊中可以對異常的信息進(jìn)行相關(guān)的處理,而且使用異常流能更好,更方便地控制程序的運(yùn)行流程,不至于代碼中出現(xiàn)很多個(gè)return,造成污染。
在使用suspend與resume方法時(shí),如果使用不當(dāng),極易造成公共的同步對象的獨(dú)占,使得其他線程無法訪問公共同步對象。也容易出現(xiàn)因?yàn)榫€程的暫停而導(dǎo)致數(shù)據(jù)不同步的情況。
yield()方法的作用是放棄當(dāng)前的cpu資源,將它讓給其他的任務(wù)去占用cpu執(zhí)行時(shí)間。
高優(yōu)先級(jí)的線程總數(shù)大部分先執(zhí)行完,但不代表高優(yōu)先級(jí)的線程全部先執(zhí)行完。
當(dāng)進(jìn)程中不存在非守護(hù)線程了,則守護(hù)線程自動(dòng)銷毀。典型的守護(hù)線程就是垃圾回收線程。調(diào)用thread.setDaemon(true);設(shè)置守護(hù)線程。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/68062.html
摘要:使用雙檢查機(jī)制來實(shí)現(xiàn)多線程環(huán)境中的延遲加載單例設(shè)計(jì)模式。類主要負(fù)責(zé)日期的轉(zhuǎn)換與格式化,但在多線程環(huán)境中,使用此類容易造成數(shù)據(jù)轉(zhuǎn)換及處理的不準(zhǔn)確,因?yàn)轭惒⒉皇蔷€程安全的。 立即加載就是使用類的時(shí)候已經(jīng)將對象創(chuàng)建完畢,常見的實(shí)現(xiàn)辦法就是直接new實(shí)例化。而立即加載從中文的語境來看,有著急、急迫的含義,所以也稱為餓漢模式。 package com.zxf.demo.singleton_0; ...
摘要:在這個(gè)范圍廣大的并發(fā)技術(shù)領(lǐng)域當(dāng)中多線程編程可以說是基礎(chǔ)和核心,大多數(shù)抽象并發(fā)問題的構(gòu)思與解決都是基于多線程模型來進(jìn)行的。一般來說,多線程程序會(huì)面臨三類問題正確性問題效率問題死鎖問題。 多線程編程或者說范圍更大的并發(fā)編程是一種非常復(fù)雜且容易出錯(cuò)的編程方式,但是我們?yōu)槭裁催€要冒著風(fēng)險(xiǎn)艱辛地學(xué)習(xí)各種多線程編程技術(shù)、解決各種并發(fā)問題呢? 因?yàn)椴l(fā)是整個(gè)分布式集群的基礎(chǔ),通過分布式集群不僅可以大...
摘要:如果執(zhí)行任務(wù)的時(shí)間早于當(dāng)前時(shí)間,則立即執(zhí)行任務(wù)。其他任務(wù)不受影響。類中的方法作用是將任務(wù)隊(duì)列中全部的任務(wù)進(jìn)行清空。全部任務(wù)都被清除,并且進(jìn)程被銷毀。類中的方法有時(shí)并不一定會(huì)停止計(jì)劃任務(wù),而是正常執(zhí)行。 Timer類的主要作用就是設(shè)置計(jì)劃任務(wù),但封裝任務(wù)的類卻是TimerTask類,執(zhí)行計(jì)劃任務(wù)的代碼要放入TimerTask的子類中,因?yàn)門imerTask是一個(gè)抽象類。 創(chuàng)建1個(gè)Tim...
摘要:調(diào)用代碼的線程就持有了對象監(jiān)視器,其他線程只有等待鎖被釋放時(shí)再次爭搶。使用多個(gè)對象,可以喚醒部分指定線程,有助于提升程序運(yùn)行的效率。方法的作用是返回等待與此鎖定相關(guān)給定條件的線程估計(jì)數(shù)。線程在等待時(shí)間到達(dá)前,可以被其他線程提前喚醒。 調(diào)用lock.lock()代碼的線程就持有了對象監(jiān)視器,其他線程只有等待鎖被釋放時(shí)再次爭搶。效果和使用synchronized關(guān)鍵字一樣,線程之間執(zhí)行的...
閱讀 3229·2021-11-12 10:36
閱讀 1304·2019-08-30 15:56
閱讀 2455·2019-08-30 11:26
閱讀 563·2019-08-29 13:00
閱讀 3622·2019-08-28 18:08
閱讀 2763·2019-08-26 17:18
閱讀 1914·2019-08-26 13:26
閱讀 2443·2019-08-26 11:39