国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

java多線程學(xué)習(xí)筆記

2019-11-14 22:08:52
字體:
供稿:網(wǎng)友
java多線程學(xué)習(xí)筆記java多線程一、引言

通常,用并發(fā)結(jié)局的問題大體上可以分為“速度”和“設(shè)計(jì)可管理性”兩種。

  • 速度:多線程機(jī)制可以通過頻繁的線程間切換,有效的避免“阻塞”問題;
  • 設(shè)計(jì)可管理性:也就是改善代碼設(shè)計(jì),并發(fā)編程更符合人的實(shí)際邏輯,可以有效的解決仿真相關(guān)的問題。
二、java線程1.創(chuàng)建與啟動(dòng)

java中通常有兩種方式創(chuàng)建線程:

一旦創(chuàng)建一個(gè)新線程并開始執(zhí)行,即調(diào)用start方法時(shí),虛擬機(jī)中就又多一個(gè)進(jìn)程,這個(gè)進(jìn)程和原先的進(jìn)程時(shí)并行的。

public class TaskR implements Runnable{    @Override    public void run() {        System.out.println("正在執(zhí)行線程B!");        System.out.println("已經(jīng)執(zhí)行完線程B!");    }}public class test {    public static void main(String[] args) {        System.out.println("正在執(zhí)行main函數(shù)111!");        TaskR b = new TaskR();        Thread threadB = new Thread(b);        System.out.println("準(zhǔn)備添加線程B!");        threadB.start();        System.out.println("繼續(xù)執(zhí)行main函數(shù)222!");//      for (int i = 0; i < 999999; i++);//延時(shí)代碼        System.out.println("正在執(zhí)行main函數(shù)333!");    }}

如上程序執(zhí)行結(jié)果輸出如下:

正在執(zhí)行main函數(shù)111!準(zhǔn)備添加線程B!繼續(xù)執(zhí)行main函數(shù)222!正在執(zhí)行main函數(shù)333!正在執(zhí)行線程B!已經(jīng)執(zhí)行完線程B!

將main函數(shù)的注釋代碼去除注釋,增加代碼延時(shí),輸出如下:

正在執(zhí)行main函數(shù)111!準(zhǔn)備添加線程B!繼續(xù)執(zhí)行main函數(shù)222!正在執(zhí)行線程B!已經(jīng)執(zhí)行完線程B!正在執(zhí)行main函數(shù)333!

由上兩組對比不難發(fā)現(xiàn),當(dāng)線程threadB一旦開始執(zhí)行(執(zhí)行threadbB.start()),main函數(shù)這條線程和線程threadB是并發(fā)的。

另外需要注意的是,多線程表面上給人的感覺是多個(gè)任務(wù)同時(shí)進(jìn)行,實(shí)際上并非如此,虛擬機(jī)通過頻繁的切換進(jìn)程來給人同時(shí)執(zhí)行的錯(cuò)覺。

2.線程狀態(tài)的轉(zhuǎn)換

線程的狀態(tài)是線程控制的基礎(chǔ)。線程狀態(tài)總的可以分為五大類:生、等待、阻塞、睡眠、死。

  • 生:線程已經(jīng)被new,且未執(zhí)行;
  • start():線程調(diào)用start()方法后即進(jìn)入等待/可運(yùn)行狀態(tài);
  • yield():此外正在執(zhí)行的線程也可以通過Thread.yield()方法使當(dāng)前線程暫停執(zhí)行,并進(jìn)入可運(yùn)行狀態(tài),從而讓步其他線程,但也可能讓步失敗,因?yàn)樵摼€程可能在進(jìn)入運(yùn)行狀態(tài)后又被再次選中。(注:讓步的線程是接著執(zhí)行線程,還是重新執(zhí)行,經(jīng)程序測試是接著執(zhí)行未執(zhí)行的代碼);
  • 阻塞:線程卡死,或不停執(zhí)行,跳不出run()方法;
  • sleep():調(diào)用Thread.sleep()方法,使線程暫停執(zhí)行一段時(shí)間,即睡眠,可以用來幫助其他進(jìn)程獲得運(yùn)行機(jī)會;
  • 死:線程執(zhí)行完畢,執(zhí)行完run()方法。
3.線程的同步與鎖

當(dāng)多個(gè)線程同時(shí)訪問互斥(可交換)數(shù)據(jù)時(shí),應(yīng)該同步以保護(hù)數(shù)據(jù),確保兩個(gè)線程不會同時(shí)更改它。通常用synchronized字段實(shí)現(xiàn),而且只能同步方法或同步代碼快。

如果兩個(gè)線程要執(zhí)行一個(gè)類中的synchronized方法,并且兩個(gè)線程使用相同的實(shí)例來調(diào)用方法,那么一次只能有一個(gè)線程能夠執(zhí)行方法,另一個(gè)需要等待,直到鎖被釋放。

4.線程的交換
  • notify()
  • notifyAll()
  • wait()
5.線程的調(diào)度
  • 休眠:Thread.sleep()
  • 優(yōu)先級
  • 讓步:Thread.yield()
  • 合并:join():join()方法是是在某個(gè)線程a中,加入一個(gè)線程b,線程b沒執(zhí)行完前,a不得執(zhí)行。

      public class TaskR implements Runnable{      @Override      public void run() {               System.out.println("正在執(zhí)行線程B!");          try {              Thread.sleep(1000);          } catch (InterruptedException e) {              e.printStackTrace();          }          System.out.println("已經(jīng)執(zhí)行完線程B!");      }  }  public class test {      public static void main(String[] args) throws InterruptedException {          System.out.println("正在執(zhí)行main函數(shù)!");          TaskR b = new TaskR();          Thread threadB = new Thread(b);          System.out.println("準(zhǔn)備添加線程B!");          threadB.start();          System.out.println("執(zhí)行完main");      }  }  public class test2 {      public static void main(String[] args) throws InterruptedException {          System.out.println("正在執(zhí)行main函數(shù)!");          TaskR b = new TaskR();          Thread threadB = new Thread(b);          System.out.println("準(zhǔn)備添加線程B!");          threadB.start();          System.out.println("threadB.join()");          threadB.join();          System.out.println("執(zhí)行完main");      }  }

    分別執(zhí)行test1和test2中的main執(zhí)行結(jié)果如下:

      正在執(zhí)行main函數(shù)!  準(zhǔn)備添加線程B!  threadB.join()  執(zhí)行完main  正在執(zhí)行線程B!  已經(jīng)執(zhí)行完線程B!

    test2中添加join()方法:

      正在執(zhí)行main函數(shù)!  準(zhǔn)備添加線程B!  threadB.join()  正在執(zhí)行線程B!  已經(jīng)執(zhí)行完線程B!  執(zhí)行完main

    在threadB中調(diào)用sleep是為了讓main函數(shù)這條線程獲得執(zhí)行機(jī)會。有結(jié)果,可知當(dāng)threadB調(diào)用join方法后,即使sleep了main函數(shù)都不能跑完,說明join方法的作用,即必須threadB執(zhí)行完才能繼續(xù)執(zhí)行main函數(shù)。

  • 守護(hù)線程
線程池

java.util.concurrent.Executors。 例:

ExecutorService pool = Executors.newFixedThreadPool(2);Thread t1 = new MyThread(); Thread t2 = new MyThread();Thread t3 = new MyThread();Thread t4 = new MyThread();pool.execute(t1);pool.execute(t2);pool.execute(t3);pool.execute(t4);pool.shutdown();

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 惠州市| 平乡县| 景东| 沁阳市| 博湖县| 安岳县| 焉耆| 闻喜县| 东乌珠穆沁旗| 嘉善县| 红桥区| 鄂州市| 新郑市| 乌拉特中旗| 辉南县| 三亚市| 遵义市| 区。| 铜陵市| 大埔县| 滕州市| 利津县| 东光县| 邮箱| 奉节县| 武义县| 大化| 黔江区| 海宁市| 嘉善县| 徐闻县| 永济市| 芦溪县| 包头市| 阿瓦提县| 河曲县| 巴青县| 开平市| 巩留县| 乐清市| 安溪县|