最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java util concurrent及基本線程原理簡介

 更新時間:2020年04月16日 11:05:12   作者:CloverLucky  
這篇文章主要介紹了Java util concurrent及基本線程原理簡介,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

一:什么是JUC

JUC就是java.util.concurrent下面的類包,專門用于多線程的開發(fā)。

二:進程和線程的區(qū)別

進程是可并發(fā)執(zhí)行的程序在某個數(shù)據(jù)集合上的一次計算活動,也是操作系統(tǒng)進行資源分配和調(diào)度的基本單位。

線程是進程的一個實體,是CPU調(diào)度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源(如程序計數(shù)器,一組寄存器和棧),但是它可與 同屬一個進程的其他的線程共享進程所擁有的全部資源。

并發(fā):多線程、 多個線程操作一個資源類,快速交替過程。

并行:多核多CPU;

線程的狀態(tài):(java底層源碼)

 public enum State {
    NEW,         // 新建線程
    RUNNABLE,    // 線程運行
    BLOCKED,     // 線程阻塞
   WAITING, // 等待
   TIMED_WAITING, // 延時等待
   TERMINATED; // 線程銷毀
}

三:wait和sleep的區(qū)別

1:類層面

wait ------object

sleep-------Thread 誰調(diào)用誰睡覺

2:是否釋放鎖層面

wait --------釋放鎖

sleep--------不釋放鎖

3:使用范圍層面

wait,notify,notifyall只能在同步方法中或者同步代碼塊中使用

sleep可以再任意的地方使用

4:異常

sleep必須捕獲異常

wait不需要捕獲異常

四:線程的幾種使用方式

1.優(yōu)先級

public final void setPriority(int newPriority)

更改線程的優(yōu)先級。

默認為5,最小為1,最大為10

設(shè)置了優(yōu)先級別之后,級別高 并不是說你一定被優(yōu)先調(diào)度,而是你的被優(yōu)先調(diào)度的概率高而已。

public class Test {
  public static void main(String[] args) {
   
    Tuzi tz=new Tuzi("兔子");
    tz.setPriority(2);
    tz.start();
    
    Wugui wg=new Wugui("烏龜");
    wg.setPriority(8);
    wg.start();
  }
}

public class Wugui extends Thread {
  @Override
  public void run() {
    for (int i = 1; i <=100; i++) {
      System.out.println("我是烏龜我在跑。。"+"----"+this.getName()+"---"+this.getPriority());
    }
  }
  public Wugui(String name) {
    super(name);
  }
}

2.線程強制運行:join()

可以通過join()方法使得一個線程強制運行,線程強制運行期間,其他線程無法運行,必須等待此線程完成之后,才可以繼續(xù)運行。

public final void join() throws InterruptedException

等待該線程終止。

public final void join(long millis)throws InterruptedException

等待該線程終止的時間最長為 millis 毫秒。超時為 0 意味著要一直等下去。

package Thread1;
class MyThread implements Runnable{  // 實現(xiàn)Runnable接口
  public void run(){  // 覆寫run()方法
    for(int i=0;i<50;i++){
      System.out.println(Thread.currentThread().getName()
          + "運行,i = " + i) ;  // 取得當(dāng)前線程的名字
    }
  }
};
public class demo1{
  public static void main(String args[]){
    MyThread mt = new MyThread() ;  // 實例化Runnable子類對象
    Thread t = new Thread(mt,"線程");    // 實例化Thread對象
    t.start() ;  // 啟動線程
    for(int i=0;i<50;i++){
      if(i>10){
        try{
          t.join() ;  // 線程強制運行
        }catch(InterruptedException e){}
      }
      System.out.println("Main線程運行 --> " + i) ;
    }
  }
};

3 線程的休眠(sleep)

  在線程中允許一個線程進行暫時的休眠,直接使用Thread.sleep()方法即可。

  sleep定義格式:

public static void sleep(long milis,int nanos)
throws InterruptedException

  首先,static,說明可以由Thread類名稱調(diào)用,其次throws表示如果有異常要在調(diào)用此方法處處理異常。

所以sleep()方法要有InterruptedException 異常處理,而且sleep()調(diào)用方法通常為Thread.sleep(500) ;形式。

控制當(dāng)前線程休眠若干毫秒

* 1秒= 1000毫秒

* 1秒 = 1000 * 1000 * 1000納秒 1000000000

package Thread1;
class MyThread implements Runnable{  // 實現(xiàn)Runnable接口
  public void run(){  // 覆寫run()方法
    for(int i=0;i<50;i++){
      try{
          Thread.sleep(500) ;  // 線程休眠
      }catch(InterruptedException e){}
      System.out.println(Thread.currentThread().getName()
          + "運行,i = " + i) ;  // 取得當(dāng)前線程的名字
    }
  }
};
public class demo1{
  public static void main(String args[]){
    MyThread mt = new MyThread() ;  // 實例化Runnable子類對象
    Thread t = new Thread(mt,"線程");    // 實例化Thread對象
    t.start() ;  // 啟動線程
  }
};

4.線程的禮讓(yield)

yield()方法實現(xiàn)線程的禮讓。

package Thread1;
class MyThread implements Runnable{  // 實現(xiàn)Runnable接口
  public void run(){  // 覆寫run()方法
    for(int i=0;i<5;i++){
      try{
        Thread.sleep(500) ;  //休眠一下
      }catch(Exception e){}
      System.out.println(Thread.currentThread().getName()
          + "運行,i = " + i) ;  // 取得當(dāng)前線程的名字
      if(i==2){
        System.out.print("線程禮讓:") ;
        Thread.currentThread().yield() ;  // 首先獲取當(dāng)前線程,然后線程禮讓
      }
    }
  }
};
public class demo1{
  public static void main(String args[]){
    MyThread my = new MyThread() ;  // 實例化MyThread對象
    Thread t1 = new Thread(my,"線程A") ;
    Thread t2 = new Thread(my,"線程B") ;
    t1.start() ;
    t2.start() ;
  }
};

5.判斷線程是否在執(zhí)行:isAlive

class MyThread implements Runnable{  // 實現(xiàn)Runnable接口
  public void run(){  // 覆寫run()方法
    for(int i=0;i<3;i++){
      System.out.println(Thread.currentThread().getName()
          + "運行,i = " + i) ;  // 取得當(dāng)前線程的名字
    }
  }
};
public class ThreadAliveDemo{
  public static void main(String args[]){
    MyThread mt = new MyThread() ;  // 實例化Runnable子類對象
    Thread t = new Thread(mt,"線程");    // 實例化Thread對象
    System.out.println("線程開始執(zhí)行之前 --> " + t.isAlive()) ;   // 判斷是否啟動
    t.start() ;  // 啟動線程
    System.out.println("線程開始執(zhí)行之后 --> " + t.isAlive()) ;   // 判斷是否啟動
    for(int i=0;i<3;i++){
      System.out.println(" main運行 --> " + i) ;
    }
    // 以下的輸出結(jié)果不確定
    System.out.println("代碼執(zhí)行之后 --> " + t.isAlive()) ;   // 判斷是否啟動
    
  }
};

6.當(dāng)前線程:CurrentThread()

  程序可以通過currentThread()方法取得當(dāng)前正在運行的線程對象,

class MyThread implements Runnable{  // 實現(xiàn)Runnable接口
  public void run(){  // 覆寫run()方法
    for(int i=0;i<3;i++){
      System.out.println(Thread.currentThread().getName()
          + "運行,i = " + i) ;  // 取得當(dāng)前線程的名字
    }
  }
};
public class CurrentThreadDemo{
  public static void main(String args[]){
    MyThread mt = new MyThread() ;  // 實例化Runnable子類對象
    new Thread(mt,"線程").start() ;    // 啟動線程
    mt.run() ;  // 直接調(diào)用run()方法
  }
};

7.線程名稱

  1,在Thread類中可以通過getName()方法取得線程名稱,通過setName()設(shè)置線程名稱。

  2,線程的名稱一般在啟動線程前設(shè)置,但也允許為運行的線程設(shè)置名稱,允許兩個Thread對象有相同名稱,但是應(yīng)該避免。

  3,如果程序沒有為線程指定名稱,系統(tǒng)會自動為線程設(shè)置名稱。

class MyThread implements Runnable{  // 實現(xiàn)Runnable接口
  public void run(){  // 覆寫run()方法
    for(int i=0;i<3;i++){
      System.out.println(Thread.currentThread().getName()
          + "運行,i = " + i) ;  // 取得當(dāng)前線程的名字
    }
  }
};
public class ThreadNameDemo{
  public static void main(String args[]){
    MyThread mt = new MyThread() ;  // 實例化Runnable子類對象
    new Thread(mt).start() ;    // 系統(tǒng)自動設(shè)置線程名稱
    new Thread(mt,"線程-A").start() ;    // 手工設(shè)置線程名稱
    new Thread(mt,"線程-B").start() ;    // 手工設(shè)置線程名稱
    new Thread(mt).start() ;    // 系統(tǒng)自動設(shè)置線程名稱
    new Thread(mt).start() ;    // 系統(tǒng)自動設(shè)置線程名稱
  }
};

五:幾種方法的比較

  • Thread.sleep(long millis),一定是當(dāng)前線程調(diào)用此方法,當(dāng)前線程進入阻塞,但不釋放對象鎖,millis后線程自動蘇醒進入可運行狀態(tài)。作用:給其它線程執(zhí)行機會的最佳方式。
  • Thread.yield(),一定是當(dāng)前線程調(diào)用此方法,當(dāng)前線程放棄獲取的cpu時間片,由運行狀態(tài)變會可運行狀態(tài),讓OS再次選擇線程。作用:讓相同優(yōu)先級的線程輪流執(zhí)行,但并不保證一定會輪流執(zhí)行。實際中無法保證yield()達到讓步目的,因為讓步的線程還有可能被線程調(diào)度程序再次選中。Thread.yield()不會導(dǎo)致阻塞。
  • t.join()/t.join(long millis),當(dāng)前線程里調(diào)用其它線程1的join方法,當(dāng)前線程阻塞,但不釋放對象鎖,直到線程1執(zhí)行完畢或者millis時間到,當(dāng)前線程進入可運行狀態(tài)。
  • obj.wait(),當(dāng)前線程調(diào)用對象的wait()方法,當(dāng)前線程釋放對象鎖,進入等待隊列。依靠notify()/notifyAll()喚醒或者wait(long timeout)timeout時間到自動喚醒。
  • obj.notify()喚醒在此對象監(jiān)視器上等待的單個線程,選擇是任意性的。notifyAll()喚醒在此對象監(jiān)視器上等待的所有線程。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot配置ssl后啟動一直是端口被占用的解決

    springboot配置ssl后啟動一直是端口被占用的解決

    這篇文章主要介紹了springboot配置ssl后啟動一直是端口被占用的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • maven安裝與環(huán)境配置圖文教程

    maven安裝與環(huán)境配置圖文教程

    這篇文章主要為大家詳細介紹了maven安裝與環(huán)境配置圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • prometheus監(jiān)控springboot應(yīng)用簡單使用介紹詳解

    prometheus監(jiān)控springboot應(yīng)用簡單使用介紹詳解

    這篇文章主要介紹了prometheus監(jiān)控springboot應(yīng)用簡單使用介紹詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • 詳解Java設(shè)計模式編程中的Flyweight享元模式的開發(fā)結(jié)構(gòu)

    詳解Java設(shè)計模式編程中的Flyweight享元模式的開發(fā)結(jié)構(gòu)

    這篇文章主要介紹了Java設(shè)計模式編程中的Flyweight享元模式的開發(fā)結(jié)構(gòu),享元模式能夠最大限度地重用現(xiàn)有的同類對象,需要的朋友可以參考下
    2016-04-04
  • Java中如何將json字符串轉(zhuǎn)換成map/list

    Java中如何將json字符串轉(zhuǎn)換成map/list

    這篇文章主要介紹了Java中如何將json字符串轉(zhuǎn)換成map/list,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • IDEA中的yml文件與properties互相轉(zhuǎn)換

    IDEA中的yml文件與properties互相轉(zhuǎn)換

    這篇文章主要介紹了IDEA中的yml文件與properties互相轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Maven基礎(chǔ)知識大梳理

    Maven基礎(chǔ)知識大梳理

    這篇文章主要是Maven基礎(chǔ)知識大梳理,Maven主要是用來解決導(dǎo)入java類依賴的jar,編譯java項目主要問題,大家可以讀一讀這篇文章,更深一步的了解Maven
    2021-08-08
  • 利用過濾器修改response中的返回值

    利用過濾器修改response中的返回值

    文章介紹了如何通過繼承HttpServletResponseWrapper并重寫Response對象的方法來獲取response中的返回值,同時還分享了如何配置過濾器
    2024-12-12
  • Java超詳細分析講解哈希表

    Java超詳細分析講解哈希表

    哈希表是一種根據(jù)關(guān)鍵碼去尋找值的數(shù)據(jù)映射結(jié)構(gòu),該結(jié)構(gòu)通過把關(guān)鍵碼映射的位置去尋找存放值的地方,說起來可能感覺有點復(fù)雜,我想我舉個例子你就會明白了,最典型的的例子就是字典
    2022-06-06
  • Maven使用方法詳及方式詳細介紹

    Maven使用方法詳及方式詳細介紹

    使用maven倉庫的話需要從網(wǎng)上下載maven的包,比如“apache-maven-3.5.4-bin.tar”,下載完成之后解壓,在解壓的文件夾中的conf目錄下的settings.xml文件夾下就可以配置maven遠程倉庫和本地倉庫的地址
    2022-11-11

最新評論

阜平县| 栾川县| 贵溪市| 桃江县| 察雅县| 秀山| 桦甸市| 达拉特旗| 吴桥县| 马龙县| 凌云县| 鄂州市| 汪清县| 乌拉特中旗| 含山县| 蕲春县| 通州区| 革吉县| 江阴市| 会泽县| 姜堰市| 娄底市| 镇坪县| 瑞金市| 华池县| 翁牛特旗| 遂溪县| 盐亭县| 布尔津县| 水富县| 岱山县| 宜宾县| 罗甸县| 徐汇区| 松原市| 二连浩特市| 仙游县| 灌南县| 迁西县| 阜康市| 华池县|