亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

簡(jiǎn)單了解Java編程中線(xiàn)程的創(chuàng)建與守護(hù)線(xiàn)程

 更新時(shí)間:2015年11月21日 09:26:07   投稿:goldensun  
這篇文章主要介紹了Java編程中線(xiàn)程的創(chuàng)建與守護(hù)線(xiàn)程,是Java多線(xiàn)程并發(fā)編程的基礎(chǔ),需要的朋友可以參考下

線(xiàn)程的兩種創(chuàng)建方式及優(yōu)劣比較
1、通過(guò)實(shí)現(xiàn)Runnable接口線(xiàn)程創(chuàng)建
(1).定義一個(gè)類(lèi)實(shí)現(xiàn)Runnable接口,重寫(xiě)接口中的run()方法。在run()方法中加入具體的任務(wù)代碼或處理邏輯。
(2).創(chuàng)建Runnable接口實(shí)現(xiàn)類(lèi)的對(duì)象。
(3).創(chuàng)建一個(gè)Thread類(lèi)的對(duì)象,需要封裝前面Runnable接口實(shí)現(xiàn)類(lèi)的對(duì)象。(接口可以實(shí)現(xiàn)多繼承)
(4).調(diào)用Thread對(duì)象的start()方法,啟動(dòng)線(xiàn)程
示例代碼:

package demo.thread; 
 
public class TreadDemo1 implements Runnable { 
  private int countDown = 10; 
  @Override 
  // 在run方法中定義任務(wù) 
  public void run() { 
    while (countDown-- > 0) { 
      System.out.println("#" + Thread.currentThread().getName() + "(" 
          + countDown + ")"); 
    } 
  } 
 
  public static void main(String[] args) { 
    // Runnable中run方法是一個(gè)空方法,并不會(huì)產(chǎn)生任何線(xiàn)程行為,必須顯式地將一個(gè)任務(wù)附著到線(xiàn)程上 
    TreadDemo1 tt=new TreadDemo1(); 
    new Thread(tt).start(); 
    new Thread(tt).start(); 
    System.out.println("火箭發(fā)射前倒計(jì)時(shí):"); 
  } 
} 

 運(yùn)行結(jié)果:
火箭發(fā)射前倒計(jì)時(shí):

#Thread-1(8)
#Thread-1(7)
#Thread-1(6)
#Thread-1(5)
#Thread-1(4)
#Thread-1(3)
#Thread-1(2)
#Thread-1(1)
#Thread-1(0)
#Thread-0(9)

2、通過(guò)繼承Thread類(lèi)創(chuàng)建線(xiàn)程
(1).首先定義一個(gè)類(lèi)去繼承Thread父類(lèi),重寫(xiě)父類(lèi)中的run()方法。在run()方法中加入具體的任務(wù)代碼或處理邏輯。
(2).直接創(chuàng)建一個(gè)ThreadDemo2類(lèi)的對(duì)象,也可以利用多態(tài)性,變量聲明為父類(lèi)的類(lèi)型。
(3).調(diào)用start方法,線(xiàn)程t啟動(dòng),隱含的調(diào)用run()方法。
示例代碼:

package demo.thread; 
 
public class ThreadDemo2 extends Thread { 
  private int countDown = 10; 
 
  @Override 
  // 在run方法中定義任務(wù) 
  public void run() { 
    while (countDown-- > 0) { 
      System.out.println("#" + this.getName() + "(" + countDown + ")"); 
    } 
  } 
 
  public static void main(String[] args) { 
    new ThreadDemo2().start(); 
    new ThreadDemo2().start(); 
    // 由于start方法迅速返回,所以main線(xiàn)程可以執(zhí)行其他的操作,此時(shí)有兩個(gè)獨(dú)立的線(xiàn)程在并發(fā)運(yùn)行 
    System.out.println("火箭發(fā)射前倒計(jì)時(shí):"); 
  } 
} 

 運(yùn)行結(jié)果:

#Thread-0(9)
#Thread-0(8)
#Thread-0(7)
#Thread-0(6)
#Thread-0(5)
#Thread-0(4)
#Thread-0(3)
#Thread-0(2)
#Thread-0(1)
#Thread-0(0)

火箭發(fā)射前倒計(jì)時(shí):

#Thread-1(9)
#Thread-1(8)
#Thread-1(7)
#Thread-1(6)
#Thread-1(5)
#Thread-1(4)
#Thread-1(3)
#Thread-1(2)
#Thread-1(1)
#Thread-1(0)

3、兩種方式的比較
首先分析兩種方式的輸出結(jié)果,同樣是創(chuàng)建了兩個(gè)線(xiàn)程,為什么結(jié)果不一樣呢?
使用實(shí)現(xiàn)Runnable接口方式創(chuàng)建線(xiàn)程可以共享同一個(gè)目標(biāo)對(duì)象 (TreadDemo1 tt=new TreadDemo1();),實(shí)現(xiàn)了多個(gè)相同線(xiàn)程處理同一份資源。
然后再看一段來(lái)自JDK的解釋?zhuān)?br /> Runnable 接口應(yīng)該由那些打算通過(guò)某一線(xiàn)程執(zhí)行其實(shí)例的類(lèi)來(lái)實(shí)現(xiàn)。類(lèi)必須定義一個(gè)稱(chēng)為run 的無(wú)參數(shù)方法。
設(shè)計(jì)該接口的目的是為希望在活動(dòng)時(shí)執(zhí)行代碼的對(duì)象提供一個(gè)公共協(xié)議。例如,Thread 類(lèi)實(shí)現(xiàn)了Runnable 。激活的意思是說(shuō)某個(gè)線(xiàn)程已啟動(dòng)并且尚未停止。
此外,Runnable 為非 Thread 子類(lèi)的類(lèi)提供了一種激活方式。通過(guò)實(shí)例化某個(gè)Thread 實(shí)例并將自身作為運(yùn)行目標(biāo),就可以運(yùn)行實(shí)現(xiàn) Runnable 的類(lèi)而無(wú)需創(chuàng)建 Thread 的子類(lèi)。大多數(shù)情況下,如果只想重寫(xiě)run() 方法,而不重寫(xiě)其他 Thread 方法,那么應(yīng)使用 Runnable 接口。這很重要,因?yàn)槌浅绦騿T打算修改或增強(qiáng)類(lèi)的基本行為,否則不應(yīng)為該類(lèi)創(chuàng)建子類(lèi)。
 
采用繼承Thread類(lèi)方式:
(1)優(yōu)點(diǎn):編寫(xiě)簡(jiǎn)單,如果需要訪(fǎng)問(wèn)當(dāng)前線(xiàn)程,無(wú)需使用Thread.currentThread()方法,直接使用this,即可獲得當(dāng)前線(xiàn)程。
(2)缺點(diǎn):因?yàn)榫€(xiàn)程類(lèi)已經(jīng)繼承了Thread類(lèi),所以不能再繼承其他的父類(lèi)。
采用實(shí)現(xiàn)Runnable接口方式:
(1)優(yōu)點(diǎn):線(xiàn)程類(lèi)只是實(shí)現(xiàn)了Runable接口,還可以繼承其他的類(lèi)。在這種方式下,可以多個(gè)線(xiàn)程共享同一個(gè)目標(biāo)對(duì)象,所以非常適合多個(gè)相同線(xiàn)程來(lái)處理同一份資源的情況,從而可以將CPU代碼和數(shù)據(jù)分開(kāi),形成清晰的模型,較好地體現(xiàn)了面向?qū)ο蟮乃枷搿?br /> (2)缺點(diǎn):編程稍微復(fù)雜,如果需要訪(fǎng)問(wèn)當(dāng)前線(xiàn)程,必須使用Thread.currentThread()方法。

后臺(tái)線(xiàn)程(守護(hù)線(xiàn)程)
所謂的后臺(tái)線(xiàn)程,是指在程序運(yùn)行的時(shí)候在后臺(tái)提供一種通用服務(wù)的線(xiàn)程,并且這種線(xiàn)程并不屬于程序中不可或缺的部分。因此當(dāng)所有的非后臺(tái)線(xiàn)程結(jié)束時(shí),程序也就終止了,同時(shí)會(huì)殺死所有后臺(tái)線(xiàn)程。反過(guò)來(lái)說(shuō),只要有任何非后臺(tái)線(xiàn)程(用戶(hù)線(xiàn)程)還在運(yùn)行,程序就不會(huì)終止。后臺(tái)線(xiàn)程在不執(zhí)行finally子句的情況下就會(huì)終止其run方法。后臺(tái)線(xiàn)程創(chuàng)建的子線(xiàn)程也是后臺(tái)線(xiàn)程。 下面是一個(gè)后臺(tái)線(xiàn)程的示例:

package demo.thread; 
 
import java.util.concurrent.TimeUnit; 
 
public class DaemonDemo implements Runnable { 
  @Override 
  public void run() { 
    try { 
      while (true) { 
        Thread.sleep(1000); 
        System.out.println("#" + Thread.currentThread().getName()); 
      } 
    } catch (InterruptedException e) { 
      e.printStackTrace(); 
    } finally {// 后臺(tái)線(xiàn)程不執(zhí)行finally子句 
      System.out.println("finally "); 
    } 
  } 
 
  public static void main(String[] args) { 
    for (int i = 0; i < 10; i++) { 
      Thread daemon = new Thread(new DaemonDemo()); 
      // 必須在start之前設(shè)置為后臺(tái)線(xiàn)程 
      daemon.setDaemon(true); 
      daemon.start(); 
    } 
    System.out.println("All daemons started"); 
    try { 
      TimeUnit.MILLISECONDS.sleep(1000); 
    } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    } 
  } 
} 

 
運(yùn)行結(jié)果:

All daemons started
#Thread-2
#Thread-3
#Thread-1
#Thread-0
#Thread-9
#Thread-6
#Thread-8
#Thread-5
#Thread-7
#Thread-4

分析:從結(jié)果可以看出,十個(gè)子線(xiàn)程并沒(méi)有無(wú)線(xiàn)循環(huán)的打印,而是在主線(xiàn)程(main())退出后,JVM強(qiáng)制關(guān)閉所有后臺(tái)線(xiàn)程。而不會(huì)有任何希望出現(xiàn)的確認(rèn)形式,如finally子句不執(zhí)行。

相關(guān)文章

  • Java_異常類(lèi)(錯(cuò)誤和異常,兩者的區(qū)別介紹)

    Java_異常類(lèi)(錯(cuò)誤和異常,兩者的區(qū)別介紹)

    下面小編就為大家?guī)?lái)一篇Java_異常類(lèi)(錯(cuò)誤和異常,兩者的區(qū)別介紹) 。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • Java如何判斷一個(gè)字符串是否包含某個(gè)字符串

    Java如何判斷一個(gè)字符串是否包含某個(gè)字符串

    這篇文章主要給大家介紹了關(guān)于Java如何判斷一個(gè)字符串是否包含某個(gè)字符串的相關(guān)資料,在實(shí)際編程中,經(jīng)常需要判斷一個(gè)字符串中是否包含某個(gè)子串,需要的朋友可以參考下
    2023-07-07
  • Java解析http協(xié)議字符串的方法實(shí)現(xiàn)

    Java解析http協(xié)議字符串的方法實(shí)現(xiàn)

    本文主要介紹了Java解析http協(xié)議字符串的方法實(shí)現(xiàn),我們探討了如何使用Java解析HTTP協(xié)議字符串,并將其封裝成了一個(gè)HttpRequest類(lèi),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • Mybatis-Plus自定義集合類(lèi)型的類(lèi)型處理器詳解

    Mybatis-Plus自定義集合類(lèi)型的類(lèi)型處理器詳解

    這篇文章主要介紹了Mybatis-Plus自定義集合類(lèi)型的類(lèi)型處理器詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java人民幣小寫(xiě)轉(zhuǎn)大寫(xiě)字符串的實(shí)現(xiàn)

    Java人民幣小寫(xiě)轉(zhuǎn)大寫(xiě)字符串的實(shí)現(xiàn)

    這篇文章主要介紹了Java人民幣小寫(xiě)轉(zhuǎn)大寫(xiě)字符串的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 淺談Spring如何解決循環(huán)依賴(lài)的問(wèn)題

    淺談Spring如何解決循環(huán)依賴(lài)的問(wèn)題

    這篇文章主要介紹了淺談Spring如何解決循環(huán)依賴(lài)的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Java 騰訊驗(yàn)證碼平臺(tái)使用實(shí)例

    Java 騰訊驗(yàn)證碼平臺(tái)使用實(shí)例

    這篇文章主要介紹了Java 騰訊驗(yàn)證碼平臺(tái)使用實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 到底如何設(shè)置Java線(xiàn)程池的大小的方法示例

    到底如何設(shè)置Java線(xiàn)程池的大小的方法示例

    在我們?nèi)粘I(yè)務(wù)開(kāi)發(fā)過(guò)程中,或多或少都會(huì)用到并發(fā)的功能。那么并發(fā)線(xiàn)程池到底設(shè)置多大呢?文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • SpringBoot集成Swagger構(gòu)建api文檔的操作

    SpringBoot集成Swagger構(gòu)建api文檔的操作

    這篇文章主要介紹了SpringBoot集成Swagger構(gòu)建api文檔的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • 關(guān)于mybatis-plus插件使用時(shí)的一些問(wèn)題小結(jié)

    關(guān)于mybatis-plus插件使用時(shí)的一些問(wèn)題小結(jié)

    這篇文章主要給大家介紹了關(guān)于mybatis-plus插件使用時(shí)的一些問(wèn)題的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-03-03

最新評(píng)論