一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 簡單了解Java編程中線程的創建與守護線程

簡單了解Java編程中線程的創建與守護線程

2020-03-01 11:21goldensun JAVA教程

這篇文章主要介紹了Java編程中線程的創建與守護線程,是Java多線程并發編程的基礎,需要的朋友可以參考下

線程的兩種創建方式及優劣比較
1、通過實現Runnable接口線程創建

(1).定義一個類實現Runnable接口,重寫接口中的run()方法。在run()方法中加入具體的任務代碼或處理邏輯。
(2).創建Runnable接口實現類的對象。
(3).創建一個Thread類的對象,需要封裝前面Runnable接口實現類的對象。(接口可以實現多繼承)
(4).調用Thread對象的start()方法,啟動線程
示例代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package demo.thread;
 
public class TreadDemo1 implements Runnable {
  private int countDown = 10;
  @Override
  // 在run方法中定義任務
  public void run() {
    while (countDown-- > 0) {
      System.out.println("#" + Thread.currentThread().getName() + "("
          + countDown + ")");
    }
  }
 
  public static void main(String[] args) {
    // Runnable中run方法是一個空方法,并不會產生任何線程行為,必須顯式地將一個任務附著到線程上
    TreadDemo1 tt=new TreadDemo1();
    new Thread(tt).start();
    new Thread(tt).start();
    System.out.println("火箭發射前倒計時:");
  }
}

 運行結果:
火箭發射前倒計時:

?
1
2
3
4
5
6
7
8
9
10
#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、通過繼承Thread類創建線程
(1).首先定義一個類去繼承Thread父類,重寫父類中的run()方法。在run()方法中加入具體的任務代碼或處理邏輯。
(2).直接創建一個ThreadDemo2類的對象,也可以利用多態性,變量聲明為父類的類型。
(3).調用start方法,線程t啟動,隱含的調用run()方法。
示例代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package demo.thread;
 
public class ThreadDemo2 extends Thread {
  private int countDown = 10;
 
  @Override
  // 在run方法中定義任務
  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線程可以執行其他的操作,此時有兩個獨立的線程在并發運行
    System.out.println("火箭發射前倒計時:");
  }
}

 運行結果:

?
1
2
3
4
5
6
7
8
9
10
#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)

火箭發射前倒計時:

?
1
2
3
4
5
6
7
8
9
10
#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、兩種方式的比較
首先分析兩種方式的輸出結果,同樣是創建了兩個線程,為什么結果不一樣呢?
使用實現Runnable接口方式創建線程可以共享同一個目標對象 (TreadDemo1 tt=new TreadDemo1();),實現了多個相同線程處理同一份資源。
然后再看一段來自JDK的解釋:
Runnable 接口應該由那些打算通過某一線程執行其實例的類來實現。類必須定義一個稱為run 的無參數方法。
設計該接口的目的是為希望在活動時執行代碼的對象提供一個公共協議。例如,Thread 類實現了Runnable 。激活的意思是說某個線程已啟動并且尚未停止。
此外,Runnable 為非 Thread 子類的類提供了一種激活方式。通過實例化某個Thread 實例并將自身作為運行目標,就可以運行實現 Runnable 的類而無需創建 Thread 的子類。大多數情況下,如果只想重寫run() 方法,而不重寫其他 Thread 方法,那么應使用 Runnable 接口。這很重要,因為除非程序員打算修改或增強類的基本行為,否則不應為該類創建子類。
 
采用繼承Thread類方式:
(1)優點:編寫簡單,如果需要訪問當前線程,無需使用Thread.currentThread()方法,直接使用this,即可獲得當前線程。
(2)缺點:因為線程類已經繼承了Thread類,所以不能再繼承其他的父類。
采用實現Runnable接口方式:
(1)優點:線程類只是實現了Runable接口,還可以繼承其他的類。在這種方式下,可以多個線程共享同一個目標對象,所以非常適合多個相同線程來處理同一份資源的情況,從而可以將CPU代碼和數據分開,形成清晰的模型,較好地體現了面向對象的思想。
(2)缺點:編程稍微復雜,如果需要訪問當前線程,必須使用Thread.currentThread()方法。

后臺線程(守護線程)
所謂的后臺線程,是指在程序運行的時候在后臺提供一種通用服務的線程,并且這種線程并不屬于程序中不可或缺的部分。因此當所有的非后臺線程結束時,程序也就終止了,同時會殺死所有后臺線程。反過來說,只要有任何非后臺線程(用戶線程)還在運行,程序就不會終止。后臺線程在不執行finally子句的情況下就會終止其run方法。后臺線程創建的子線程也是后臺線程。 下面是一個后臺線程的示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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 {// 后臺線程不執行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之前設置為后臺線程
      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();
    }
  }
}

 
運行結果:

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

分析:從結果可以看出,十個子線程并沒有無線循環的打印,而是在主線程(main())退出后,JVM強制關閉所有后臺線程。而不會有任何希望出現的確認形式,如finally子句不執行。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 暖暖免费观看高清在线 | 超碰成人在线播放 | 欧美巨吊 | 暖暖 免费 高清 日本 中文 | 亚洲国产成人资源在线桃色 | 9久re在线观看视频精品 | 国产视频a区 | 国产精品国语自产拍在线观看 | 午夜国产精品影院在线观看 | 欧美一级片在线免费观看 | 污文啊好棒棒啊好了 | 国产区成人综合色在线 | 忘忧草在线 | 欧美成人tv在线观看免费 | 日日摸夜夜爽色婷婷91 | 大香人蕉免费视频75 | 色婷丁香 | 亚洲高清无在码在线电影 | 175m美女被网友灌醉啪啪玩脚 | 色女的乖男人 | 亚洲系列在线 | 亚洲精品国产在线观看 | 丰满在线观看 | 久久久久青草大香线综合精品 | 欧洲男同直粗无套播放视频 | 成人小视频在线观看免费 | 99视频在线免费观看 | 国内自拍成人网在线视频 | 四虎网站在线 | 欧美成人福利视频 | 久久伊人电影 | 性刺激欧美三级在线现看中文 | 99久久国产综合精品女不卡 | 福利视频导航大全 | 国产欧美一区二区精品性色 | 好深快点再快点好爽视频 | 欧洲vodafonewifi日本 | 国产高清在线精品一区 | 精品无码国产污污污免费网站2 | 99久久精品国产免看国产一区 | 齐天大性之七仙女欲春迅雷链接 |