并發(fā)編程-多線程基礎(chǔ)

上一篇 <<<安全架構(gòu)設(shè)計(jì)方案
下一篇 >>>線程安全與解決方案


多線程: 在同一個(gè)進(jìn)程開(kāi)啟了多條不同的執(zhí)行路徑踢涌,每條執(zhí)行路徑就是一個(gè)線程,多條不同路徑同時(shí)執(zhí)行背苦。

優(yōu)點(diǎn):
a潘明、提高程序效率 (是否真正實(shí)現(xiàn)多線程是看CPU核數(shù)的,對(duì)于單核的CPU厚宰,程序多線程只不過(guò)是調(diào)度不斷的切換遂填,時(shí)間非常的小而產(chǎn)生的一種錯(cuò)覺(jué)。所以線程設(shè)置優(yōu)先級(jí)撵幽、讓步等基本上都行不通的礁击。
b逗载、快速響應(yīng)給客戶端撕贞,給用戶更加好的體驗(yàn)
c捏膨、每個(gè)線程之間相互不影響

進(jìn)程和線程區(qū)別

進(jìn)程是所有線程的集合食侮,每一個(gè)線程是進(jìn)程中的一條執(zhí)行路徑,線程只是一條執(zhí)行路徑链快。

單線程和多線程的區(qū)別

單線程:就是使用一條線程從上到下執(zhí)行完代碼眉尸,效率比較低,且響應(yīng)也比較慢霉祸,對(duì)用戶不是很友好丝蹭。
多線程:開(kāi)啟多條不同的線程坪蚁,每個(gè)線程執(zhí)行不同的任務(wù),每個(gè)線程之間相互不影響贱田。

多線程創(chuàng)建方式

  • 繼承Thread
  • 實(shí)現(xiàn)Runnable 接口
  • 使用Callable--可以有返回值
  • 線程池--線程的復(fù)用機(jī)制
  • @Async注解---存在@Async失效之謎

繼承Thread類好還是實(shí)現(xiàn)Runnable接口好湘换?
Runnable接口好统阿,因?yàn)閷?shí)現(xiàn)了接口還可以繼續(xù)繼承。
繼承Thread類不能再繼承帆离。

多線程的特性

  • 原子性

一個(gè)操作或多個(gè)操作要么都執(zhí)行结澄,要么都不執(zhí)行岸夯。

  • 可見(jiàn)性

多線程訪問(wèn)同一個(gè)變量時(shí)猜扮,一個(gè)線程修改了值监婶,其他線程應(yīng)該立即看到修改的值,否則容易造成臟讀煮盼。[若兩個(gè)線程在不同的cpu僵控,那么線程1改變了i的值還沒(méi)刷新到主存,線程2又使用了i报破,那么這個(gè)i值肯定還是之前的千绪,線程1對(duì)變量的修改線程沒(méi)看到這就是可見(jiàn)性問(wèn)題。 ]

  • 有序性

處理器為了提高程序運(yùn)行效率,可能對(duì)輸入代碼的順序有優(yōu)化帆疟,但不能修改依賴關(guān)系,必須要保證執(zhí)行結(jié)果踪宠。多線程如果順序不弄好妈嘹,單個(gè)方法沒(méi)依賴關(guān)系润脸,但全局有依賴關(guān)系就會(huì)導(dǎo)致很大問(wèn)題。

int a = 10;    //語(yǔ)句1
int r = 2;    //語(yǔ)句2
a = a + 3;    //語(yǔ)句3
r = a*a;     //語(yǔ)句4
則因?yàn)橹嘏判虻苟椋€可能執(zhí)行順序?yàn)?2-1-3-4爆价,1-3-2-4
但絕不可能 2-1-4-3媳搪,因?yàn)檫@打破了依賴關(guān)系秦爆。

多線程的應(yīng)用場(chǎng)景

  • 分批發(fā)送短信
  • 日志記錄
  • 比較耗時(shí)的業(yè)務(wù)獨(dú)立處理
  • 數(shù)據(jù)庫(kù)連接池
  • 迅雷多線程下載等等限。

線程的類型

  • 主線程:main線程/進(jìn)程線程
  • 守護(hù)線程:gc線程 (主線程掛了活逆,守護(hù)線程也會(huì)被自動(dòng)銷毀.)
  • 用戶線程:用戶自己創(chuàng)建的線程(主進(jìn)程關(guān)閉后還會(huì)繼續(xù)執(zhí)行
public static void main(String[] args) {
    Thread t1 = new Thread(new Runnable() {
        public void run() {
            for(int i=0;i<10;i++){
                System.out.println("子線程 i:"+i);
            }
        }
    });
    t1.start();
    System.out.println("主線程已關(guān)閉");
}
主線程已關(guān)閉
子線程 i:0
子線程 i:1
子線程 i:2
……

使用setDaemon(true)方法可以將用戶線程轉(zhuǎn)為守護(hù)線程蔗候,和主線程一起銷毀

public class DaemonThread {

   public static void main(String[] args) {
      Thread thread = new Thread(new Runnable() {
         public void run() {
            while (true) {
               try {
                  Thread.sleep(100);
               } catch (Exception e) {
                  // TODO: handle exception
               }
               System.out.println("我是子線程...");
            }
         }
      });
      thread.setDaemon(true);
      thread.start();
      for (int i = 0; i < 10; i++) {
         try {
            Thread.sleep(100);
         } catch (Exception e) {

         }
         System.out.println("我是主線程");
      }
      System.out.println("主線程執(zhí)行完畢!");
   }
}
我是子線程...
我是主線程
主線程執(zhí)行完畢!

多線程的狀態(tài)

如何優(yōu)雅的停止一個(gè)線程

// 設(shè)置可見(jiàn)性
private volatile boolean flag = true;
public void run() {
    System.out.println(Thread.currentThread().getName());
    // 能保證在線程執(zhí)行完畢后锈遥,才真正的停止一個(gè)線程
    while (flag) {

    }
}

public void stopThread() {
    this.flag = false;
}

其他知識(shí)

a所灸、join方法:join方法對(duì)應(yīng)的線程執(zhí)行完畢后,后面的才可以繼續(xù)執(zhí)行

public static void main(String[] args) {
   final Thread t1 = new Thread(new Runnable() {
      public void run() {
         for (int i = 0; i < 5; i++) {
            System.out.println("t1,i:" + i);
         }
      }
   });
   final Thread t2 = new Thread(new Runnable() {
      public void run() {
         try {
            t1.join();
         } catch (Exception e) {
         }
         for (int i = 0; i < 5; i++) {
            System.out.println("t2,i:" + i);
         }
      }
   });
   t1.start();
   t2.start();
}
t1,i:0
t1,i:1
t1,i:2
t1,i:3
t1,i:4
t2,i:0
t2,i:1
t2,i:2
t2,i:3
t2,i:4

b钾唬、priority優(yōu)先級(jí)設(shè)置抡秆,范圍為1-10吟策,其中10最高,默認(rèn)值為5着撩。

public static void main(String[] args) {
    PrioritytThread prioritytThread = new PrioritytThread();
    Thread t1 = new Thread(prioritytThread);
    Thread t2 = new Thread(prioritytThread);
    t1.start();
    // 注意設(shè)置了優(yōu)先級(jí)匾委, 不代表每次都一定會(huì)被執(zhí)行。 只是CPU調(diào)度會(huì)優(yōu)先分配
    t1.setPriority(10);
    t2.start();
}

c憋沿、Thread.yield()沪猴,暫停當(dāng)前正在執(zhí)行的線程采章,并執(zhí)行其他相同優(yōu)先級(jí)的線程壶辜。目的是讓具有相同優(yōu)先級(jí)的線程之間能夠適當(dāng)?shù)妮啌Q執(zhí)行。
可能沒(méi)有效果抵怎,因?yàn)樽尣降木€程可能被線程調(diào)度程序再次選中岭参。

多線程產(chǎn)生死鎖的原因

同步中嵌套同步,導(dǎo)致鎖無(wú)法釋放和獲取

死鎖診斷

使用jdk自帶的jconsole工具即可


相關(guān)文章鏈接:
<<<線程安全與解決方案
<<<鎖的深入化
<<<鎖的優(yōu)化
<<<Java內(nèi)存模型(JMM)
<<<Volatile解決JMM的可見(jiàn)性問(wèn)題
<<<Volatile的偽共享和重排序
<<<CAS無(wú)鎖模式及ABA問(wèn)題
<<<Synchronized鎖
<<<Lock鎖
<<<AQS同步器
<<<Condition
<<<CountDownLatch同步計(jì)數(shù)器
<<<Semaphore信號(hào)量
<<<CyclicBarrier屏障
<<<線程池
<<<并發(fā)隊(duì)列
<<<Callable與Future模式
<<<Fork/Join框架
<<<Threadlocal
<<<Disruptor框架
<<<如何優(yōu)化多線程總結(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市秒际,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌闽颇,老刑警劉巖寄锐,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異剩膘,居然都是意外死亡沿癞,警方通過(guò)查閱死者的電腦和手機(jī)椎扬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門蚕涤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)铣猩,“玉大人,你說(shuō)我怎么就攤上這事达皿』呒纾” “怎么了汰规?”我有些...
    開(kāi)封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵溜哮,是天一觀的道長(zhǎng)色解。 經(jīng)常有香客問(wèn)我,道長(zhǎng)述吸,這世上最難降的妖魔是什么萧恕? 我笑而不...
    開(kāi)封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮朴读,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘衅金。我一直安慰自己簿煌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布惩琉。 她就那樣靜靜地躺著瞒渠,像睡著了一般技扼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上剿吻,一...
    開(kāi)封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音纺棺,去河邊找鬼晰搀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛杆逗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播罪郊,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼悔橄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼腺毫!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起睛挚,我...
    開(kāi)封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤急黎,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后淤击,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體故源,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绳军,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了耳贬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猎唁。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖腐魂,靈堂內(nèi)的尸體忽然破棺而出逐纬,到底是詐尸還是另有隱情,我是刑警寧澤兔毒,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布甸箱,位于F島的核電站,受9級(jí)特大地震影響豪嗽,放射性物質(zhì)發(fā)生泄漏豌骏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一计贰、第九天 我趴在偏房一處隱蔽的房頂上張望框舔。 院中可真熱鬧,春花似錦刘绣、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至拇舀,卻和暖如春蜻底,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工抠璃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留搏嗡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓采盒,卻偏偏與公主長(zhǎng)得像纽甘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子悍赢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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