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

java  多線程的三種構(gòu)建方法

 更新時(shí)間:2017年09月17日 14:43:45   投稿:lqh  
這篇文章主要介紹了java 多線程的三種構(gòu)建方法的相關(guān)資料,這里提供三種實(shí)現(xiàn)方法,希望大家能夠掌握,很重要的基礎(chǔ)知識,需要的朋友可以參考下

java  多線程的三種構(gòu)建方法

繼承Thread類創(chuàng)建線程類

public class Thread extends Object implements Runnable
  1. 定義Thread類的子類,并重寫其run()方法
  2. 創(chuàng)建Thread子類的實(shí)例,即創(chuàng)建了線程對象
  3. 調(diào)用線程對象的start()方法啟動(dòng)線程
public class FirstThread extends Thread {
  public void run(){
    for(int i=0;i<100;i++){
      /*
       * Thread類已經(jīng)繼承了Object
       * Object類創(chuàng)建了name選項(xiàng) 并且有其getName(),setName()方法
       * 在繼承Thread的類里面使用時(shí)只需要用this引用
      */
      System.out.println(this.getName()+" "+i);
    }
  }

  public static void main(String[] args) {
    for(int i=0;i<100;i++){
      System.out.println(Thread.currentThread().getName()+" "+i);
      if(i==20){
        new FirstThread().start();
        new FirstThread().start();
      }
    }
  }

}

Thread類已經(jīng)繼承了Object

Object類創(chuàng)建了name選項(xiàng) 并且有其getName(),setName()方法

在繼承Thread的類里面使用時(shí)只需要用this引用

上面兩個(gè)副線程和主線程隨機(jī)切換,又因?yàn)槭褂玫氖抢^承Thread的類所以兩個(gè)副線程不能共享資源

start()方法調(diào)用后并不是立即執(zhí)行多線程代碼,而是使得該線程編程可運(yùn)行狀態(tài),什么時(shí)候運(yùn)行是由操作系統(tǒng)決定的

實(shí)現(xiàn)Runnable接口創(chuàng)建線程類

public Thread() 
public Thread(Runnable target) 
public Thread(Runnable target,String name)
  • 定義Runnable接口的實(shí)現(xiàn)類,并重寫該接口的run()方法
  • 創(chuàng)建Runnable實(shí)現(xiàn)類的實(shí)例,并以此作為Thread的target來創(chuàng)建Thread對象,該Thread對象才是真正的線程對象。
public class SecondThread implements Runnable {
  public void run(){
    for(int i=0;i<100;i++){
      System.out.println(Thread.currentThread().getName()+" "+i);
    }
  }

  public static void main(String[] args) {
    for(int i=0;i<100;i++){
      System.out.println(Thread.currentThread().getName()+" "+i);

      if(i==20){
        SecondThread st=new SecondThread();
        //通過new Thread(target,name)創(chuàng)建線程
        new Thread(st,"新線程1").start();
        new Thread(st,"新線程2").start();
      }
    }
  }
}

上面的結(jié)果是兩個(gè)副線程和主線程隨機(jī)切換,但是并沒有共享資源,因?yàn)樗麄兏緵]有能用來共享的資源。

start()方法調(diào)用后并不是立即執(zhí)行多線程代碼,而是使得該線程編程可運(yùn)行狀態(tài),什么時(shí)候運(yùn)行是由操作系統(tǒng)決定的
繼承Thread類和創(chuàng)建Runnable接口的共享資源詳解

在只有可以用來共享的資源時(shí)候,也就是同用一個(gè)實(shí)例化對象。兩個(gè)創(chuàng)建方式在共享資源時(shí)才會有所區(qū)別,否則它們都不會共享資源共享資源通常用private static 修飾符來修飾。

class Thread1 extends Thread{ 
  private int count=5; 
  private String name; 
  public Thread1(String name) { 
    this.name=name; 
  } 
  public void run() { 
    for (int i = 0; i < 5; i++) { 
      System.out.println(name + "運(yùn)行 count= " + count--); 
      try { 
        sleep((int) Math.random() * 10); 
      } catch (InterruptedException e) { 
        e.printStackTrace(); 
      } 
    } 

  } 
} 

public class Main { 

  public static void main(String[] args) { 
    Thread1 mTh1=new Thread1("A"); 
    Thread1 mTh2=new Thread1("B"); 
    mTh1.start(); 
    mTh2.start(); 

  } 

} 

B運(yùn)行 count= 5 
A運(yùn)行 count= 5 
B運(yùn)行 count= 4 
B運(yùn)行 count= 3 
B運(yùn)行 count= 2 
B運(yùn)行 count= 1 
A運(yùn)行 count= 4 
A運(yùn)行 count= 3 
A運(yùn)行 count= 2 
A運(yùn)行 count= 1

正是因?yàn)橛辛藀rivate int count=5;一句才有了共享資源,但這是繼承Thread類的子類,并不能共享資源

class Thread2 implements Runnable{ 
  private int count=15; 
  public void run() { 
     for (int i = 0; i < 5; i++) { 
       System.out.println(Thread.currentThread().getName() + "運(yùn)行 count= " + count--); 
        try { 
          Thread.sleep((int) Math.random() * 10); 
        } catch (InterruptedException e) { 
          e.printStackTrace(); 
        } 
      } 

  } 

} 
public class Main { 

  public static void main(String[] args) { 

    Thread2 my = new Thread2(); 
      new Thread(my, "C").start();//同一個(gè)mt,但是在Thread中就不可以,如果用同一個(gè)實(shí)例化對象mt,就會出現(xiàn)異常   
      new Thread(my, "D").start(); 
      new Thread(my, "E").start(); 
  } 

} 

C運(yùn)行 count= 15 
D運(yùn)行 count= 14 
E運(yùn)行 count= 13 
D運(yùn)行 count= 12 
D運(yùn)行 count= 10 
D運(yùn)行 count= 9 
D運(yùn)行 count= 8 
C運(yùn)行 count= 11 
E運(yùn)行 count= 12 
C運(yùn)行 count= 7 
E運(yùn)行 count= 6 
C運(yùn)行 count= 5 
E運(yùn)行 count= 4 
C運(yùn)行 count= 3 
E運(yùn)行 count= 2

同樣的正是因?yàn)橛辛藀rivate int count=15這個(gè)共同的實(shí)例化對象,實(shí)現(xiàn)Runnable的類才可以共享資源

那么為什么繼承Thread類的子類實(shí)現(xiàn)Runable接口的類在共享資源時(shí)有區(qū)別呢?

因?yàn)镴ava中只能支持單繼承,單繼承特點(diǎn)意味著只能有一個(gè)子類去繼承 而Runnabl接口后可以跟好多類,便可以進(jìn)行多個(gè)線程共享一個(gè)資源的操作

使用Callable和Future創(chuàng)建線程

Callable怎么看起來都像Runnable接口的增強(qiáng)版,Callable有一個(gè)call()方法相當(dāng)于Runnable的run()方法,但是功能卻更加強(qiáng)大:

call()方法可以有返回值
call()方法可以聲明拋出異常

Callable接口有泛型限制,Callable接口里的泛型形參類型與call()方法的返回值類型相同。 而且Callable接口是函數(shù)式接口,因此可使用Lambda表達(dá)式創(chuàng)建Callable對象 Runnable接口也是函數(shù)式接口,因此也可以使用Lambda表達(dá)式創(chuàng)建Runnable對象

  1. 創(chuàng)建Callable接口的實(shí)現(xiàn)類,并實(shí)現(xiàn)call()方法,該call()方法將作為線程執(zhí)行體,再創(chuàng)建Callable實(shí)現(xiàn)類的實(shí)例
  2. 使用FutureTask類來包裝Callable對象,該FutureTask對象封裝了該Callable對象的call()方法
  3. 使用FutureTask類對象作為Thread對象的target創(chuàng)建并啟動(dòng)新線程
  4. 調(diào)用FutureTask對象的get()方法來獲得子線程結(jié)束后的返回值
public class ThirdThread implements Callable<Integer> {
  public Integer call(){
    int i=0;
    for(;i<100;i++){
      System.out.println(Thread.currentThread().getName()+" "+i);
    }
    return i;
  }

  public static void main(String[] args){
    ThirdThread tt=new ThirdThread();
    FutureTask<Integer> task=new FutureTask<>(tt);
    Thread t=new Thread(task,"有返回值的線程");
    for(int i=0;i<100;i++){
      System.out.println(Thread.currentThread().getName()+" "+i);
      if(i==20){
        t.start();
      }
    }
    try{
      System.out.println("返回值是:"+task.get());
    }catch(Exception e){
      e.printStackTrace();
    }
  }
}

使用Lambda表達(dá)式的Callable和Future創(chuàng)建的線程

public class ThirdThread{
  public static void main(String[] args){
    ThirdThread tt=new ThirdThread();
    //先使用Lambda表達(dá)式創(chuàng)建Callable<Integer>對象
    //使用FutureTask封裝Callable對象
    FutureTask<Integer> task=new FutureTask<Integer>((Callable<Integer>)()->{
      int i=0;
      for(;i<100;i++){
        System.out.println(Thread.currentThread().getName()+"的循環(huán)變量i的值:"+i);
      }
      return i;
    });

    for(int i=0;i<100;i++){
      System.out.println(Thread.currentThread().getName()+"的循環(huán)變量i的值:"+i);
      if(i==20){
        new Thread(task,"有返回值的線程").start();
      }
    }
    try{
      System.out.println("子線程的返回值"+task.get());
    }catch(Exception e){
      e.printStackTrace();
    }
  }
}

如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • 從零開始學(xué)springboot整合feign跨服務(wù)調(diào)用的方法

    從零開始學(xué)springboot整合feign跨服務(wù)調(diào)用的方法

    這篇文章主要介紹了從零開始學(xué)springboot整合feign跨服務(wù)調(diào)用的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Java多種方法實(shí)現(xiàn)合并多個(gè)list對象列表

    Java多種方法實(shí)現(xiàn)合并多個(gè)list對象列表

    Java編程中,合并多個(gè)列表對象可以通過Stream?API或傳統(tǒng)循環(huán)方式實(shí)現(xiàn),使用Stream?API合并時(shí),利用flatMap方法將嵌套的List展平,再通過collect方法收集成一個(gè)新的列表,傳統(tǒng)循環(huán)則通過創(chuàng)建一個(gè)空的ArrayList,并通過遍歷每個(gè)列表將元素添加進(jìn)去
    2024-09-09
  • Java實(shí)現(xiàn)五子棋游戲

    Java實(shí)現(xiàn)五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Java后綴數(shù)組之求sa數(shù)組的實(shí)例代碼

    Java后綴數(shù)組之求sa數(shù)組的實(shí)例代碼

    后綴數(shù)組就是一個(gè)字符串所有后綴大小排序后的一個(gè)集合,然后我們根據(jù)后綴數(shù)組的一些性質(zhì)就可以實(shí)現(xiàn)各種需求。這篇文章主要介紹了Java后綴數(shù)組-求sa數(shù)組,需要的朋友可以參考下
    2018-04-04
  • Java中List與數(shù)組之間的相互轉(zhuǎn)換

    Java中List與數(shù)組之間的相互轉(zhuǎn)換

    在日常Java學(xué)習(xí)或項(xiàng)目開發(fā)中,經(jīng)常會遇到需要int[]數(shù)組和List列表相互轉(zhuǎn)換的場景,然而往往一時(shí)難以想到有哪些方法,最后可能會使用暴力逐個(gè)轉(zhuǎn)換法,往往不是我們所滿意的,下面這篇文章主要給大家介紹了關(guān)于Java中List與數(shù)組之間的相互轉(zhuǎn)換,需要的朋友可以參考下
    2023-05-05
  • 淺談java的TCP和UDP編程(附實(shí)例講解)

    淺談java的TCP和UDP編程(附實(shí)例講解)

    下面小編就為大家?guī)硪黄獪\談java的TCP和UDP編程(附實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • Tomcat+JDK安裝和配置教程

    Tomcat+JDK安裝和配置教程

    這篇文章主要為大家詳細(xì)介紹了Tomcat+JDK安裝和配置教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • SpringBoot中實(shí)現(xiàn)加載遠(yuǎn)程配置的代碼示例

    SpringBoot中實(shí)現(xiàn)加載遠(yuǎn)程配置的代碼示例

    本文章將通過結(jié)合consul config來講解在springboot中如何加載遠(yuǎn)程配置:通過consul config加載consul server中存儲的配置,需要的朋友可以參考下
    2023-06-06
  • 詳解Java中Vector和ArrayList的區(qū)別

    詳解Java中Vector和ArrayList的區(qū)別

    這篇文章主要為大家詳細(xì)介紹了Java中Vector和ArrayList的區(qū)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Spring基礎(chǔ)之AOP的概念介紹

    Spring基礎(chǔ)之AOP的概念介紹

    AOP是Spring的關(guān)鍵特性之一,雖然Spring的IOC特性并不依賴于AOP,本文重點(diǎn)介紹AOP編程中的一些術(shù)語,這些術(shù)語不僅僅局限于Spring,它適用于所有的AOP編程,感興趣的朋友一起看看吧
    2022-06-06

最新評論

兴山县| 巴马| 周口市| 华池县| 松溪县| 枣阳市| 姚安县| 资溪县| 义马市| 宿松县| 郯城县| 新干县| 新郑市| 新乡县| 瑞金市| 桑植县| 高要市| 渝北区| 东港市| 印江| 佛坪县| 彭阳县| 司法| 清徐县| 西林县| 永和县| 客服| 石棉县| 汉沽区| 吉隆县| 蒙自县| 益阳市| 方正县| 衢州市| 松滋市| 崇义县| 临武县| 高尔夫| 宁远县| 黄浦区| 海阳市|