亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java并發編程示例(二):獲取和設置線程信息

2019-11-26 15:20:40
字體:
來源:轉載
供稿:網友

Thread類包含幾個屬性,這些屬性所表示的信息能幫助我們識別線程、觀察其狀態、控制其優先級等。這些線程包括如下幾種:

ID: 該屬性表示每個線程的唯一標識;
Name: 該屬性存儲每個線程的名稱;
Priority: 該屬性存儲每個Thread對象的優先級。線程優先級分1到10十個級別,1表示最低優先級,10表示最高優先級。并不推薦修改線程的優先級,但是如果確實有這方面的需求,也可以嘗試一下。
Status: 該屬性存儲線程的狀態。線程共有六種不同的狀態:新建(new)、運行(runnable)、阻塞(blocked)、等待(waiting)、限時等待(time waiting)或者終止(terminated)。線程的狀態必定是其中一種。

在本小節,我們將開發一個程序,程序中新建十個線程,并且設定每個線程的名稱和優先級。然后執行線程,觀察線程的狀態信息,直到線程執行結束。再說明一點,這些線程還是計算一個數的乘法表。

知其然

按照下面所示步驟,來實現該示例:

1.創建一個名為 Calculator的類,實現Runnable接口。代碼如下:

復制代碼 代碼如下:

public class Calculator implements Runnable {

2.聲明一個私有的整形屬性,名稱為number,實現該類的構造函數來初始化剛剛聲明的屬性。代碼如下:

復制代碼 代碼如下:

private int number;

public Calculator(int number) {
    this.number = number;
}

3.實現run()方法,該方法是我們創建的線程執行時運行的程序(instruction),故而該方法用于計算乘法表。具體代碼如下:

復制代碼 代碼如下:

@Override
public void run() {
    for (int i = 0; i < 10; i++) {
        System.out.printf("%s: %d * %d = %d/n",
                Thread.currentThread().getName(),
                number, i, i * number);
    }
}

4.現在,我們來實現示例應用的主類(main class)。創建名為Main的類,在該類中添加main方法。代碼如下:
復制代碼 代碼如下:

public class Main {
    public static void main(String[] args) {

5.創建兩個包含十個元素數組,一個是Thread類型的,一個是Thread.State類型,然后全部初始化。這兩個數組,一個用于存儲我們將以執行的線程,另外一個存儲這些線程的狀態。代碼如下:

復制代碼 代碼如下:

Thread[] threads = new Thread[10];
Thread.State[] status = new Thread.State[threads.length];

6.創建十個Calculator對象,并且使用不同的數來初始化每個對象。使用這些Calculator對象創建十個Thread對象,存儲到上面的創建數組中。同時,設置這些線程的優先級,五個設置成最高優先級;五個設置成最低優先級。代碼如下:

復制代碼 代碼如下:

for (int i = 0; i < threads.length; i++) {
    threads[i] = new Thread(new Calculator(i));
    if ((i % 2) == 0) {
        threads[i].setPriority(Thread.MAX_PRIORITY);
    } else {
        threads[i].setPriority(Thread.MIN_PRIORITY);
    }
    threads[i].setName("Thread-" + i);
}

7.創建一個PrintWriter對象,用于將線程狀態的變換記錄到文件中。代碼如下:
復制代碼 代碼如下:

try (FileWriter file = new FileWriter("D://thread.log");
     PrintWriter pw = new PrintWriter(file)) {

這里使用了Java7的語法,所以請將JDK升級到第七版,把編譯工具設置成Java7。否則會報語法錯誤。

8.將所有線程的狀態寫到文件中?,F在,現在的狀態應該是新建(NEW)。代碼如下:

復制代碼 代碼如下:

for (int i = 0; i < threads.length; i++) {
    Thread thread = threads[i];
    pw.println("Main: Status of Thread " + i +
            " : " + threads[i].getState());
    status[i] = threads[i].getState();
}

9.啟動所有線程。代碼入下:
復制代碼 代碼如下:

for (int i = 0; i < threads.length; i++) {
    threads[i].start();
}

10.另外一方面,我們一直監控線程,直到線程執行結束。如果我們檢測到線程的狀態有所改變,則立即將線程狀態寫入到文件中。代碼如下:
復制代碼 代碼如下:

boolean finish = false;

while (!finish) {
    for (int i = 0; i < threads.length; i++) {
        if (threads[i].getState() != status[i]) {
            writeThreadInfo(pw, threads[i], status[i]);
            status[i] = threads[i].getState();
        }
    }
    finish = true;
    for (int i = 0; i < threads.length; i++) {
        finish = finish
                && (threads[i].getState() == Thread.State.TERMINATED);
    }
}

11.實現writeThreadInfo方法,該方法將線程的ID、名稱、優先級、舊的狀態、新的狀態寫入到文件中。代碼如下:

復制代碼 代碼如下:

/**
 * 將一個線程的狀態輸出到一個文件中。
 *
 * @param pw     PrintWriter對象
 * @param thread 需要輸出狀態的線程對象
 * @param state  線程的舊狀態
 */
private static void writeThreadInfo(PrintWriter pw,
                                  Thread thread, Thread.State state) {
    pw.printf("Main : Id %d = %s/n", thread.getId(), thread.getName());
    pw.printf("Main : Priority: %d/n", thread.getPriority());
    pw.printf("Main : Old State: %s/n", state);
    pw.printf("Main : New State: %s/n", thread.getState());
    pw.printf("Main : ********************************/n");
}

12.運行該示例,然后打開thread.log文件,查看所有線程的演化過程。

知其所以然

下面是thread.log文件的內容片段。從文件內容可以看出,高優先級的線程大致比低優先級的線程較早完成執行。另外,也可以看到每個線程的狀態演化過程。

復制代碼 代碼如下:

Main : ********************************
Main : Id 11 = Thread-2
Main : Priority: 10
Main : Old State: BLOCKED
Main : New State: TERMINATED
Main : ********************************
Main : Id 13 = Thread-4
Main : Priority: 10
Main : Old State: BLOCKED
Main : New State: TERMINATED
Main : ********************************
Main : Id 14 = Thread-5
Main : Priority: 1
Main : Old State: BLOCKED
Main : New State: TERMINATED
Main : ********************************

下面是控制臺的輸出片段。輸出的是每個線程計算的乘法表,以及所有的線程計算過程。同時,從這里可以更細粒度地看到每個線程的演化過程。

復制代碼 代碼如下:

Thread-8: 8 * 2 = 16
Thread-8: 8 * 3 = 24
Thread-8: 8 * 4 = 32
Thread-6: 6 * 0 = 0
Thread-6: 6 * 1 = 6
Thread-6: 6 * 2 = 12
Thread-6: 6 * 3 = 18
Thread-6: 6 * 4 = 24
Thread-6: 6 * 5 = 30
Thread-6: 6 * 6 = 36
Thread-6: 6 * 7 = 42
Thread-6: 6 * 8 = 48
Thread-6: 6 * 9 = 54
Thread-5: 5 * 0 = 0
Thread-5: 5 * 1 = 5
Thread-5: 5 * 2 = 10
Thread-5: 5 * 3 = 15
Thread-5: 5 * 4 = 20

Thread類有可以存儲線程信息所需的所有屬性。Java虛擬機使用線程優先級來每個時刻調度一個線程來使用CPU,并且根據線程的情況來設置其每個線程的狀態。

如果沒有設置線程的名稱,Java虛擬機會使用這種格式來時分配一個名稱,Thread-XX,其中XX是一個數字。我們不能修改線程的ID以及線程的狀態。Thread類也沒有實現setId()和setStatus()方法,以允許做出這些修改。

永無止境

在本節,我們學習了如何使用Thread對象來訪問線程信息。其實,Runnable的實現類也運行我們訪問這些信息。Thread類的靜態方法currentThread()可以獲取正在執行的Runnable實現類的對象,進而訪問線程的信息。

需要注意的是,如果嘗試設置1到10以外的優先級,setPriority()會拋出名為IllegalArgumentException的異常,

拿來主義

本文是從 《Java 7 Concurrency Cookbook》 (D瓜哥竊譯為 《Java7并發示例集》 )翻譯而來,僅作為學習資料使用。沒有授權,不得用于任何商業行為。

小有所成

Calculator類的完整代碼

復制代碼 代碼如下:

package com.diguage.books.concurrencycookbook.chapter1.recipe2;

/**
 * Date: 2013-09-13
 * Time: 19:49
 */
public class Calculator implements Runnable {
    private int number;

    public Calculator(int number) {
        this.number = number;
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.printf("%s: %d * %d = %d/n",
                    Thread.currentThread().getName(),
                    number, i, i * number);
        }
    }
}

Main類的完整代碼

復制代碼 代碼如下:

package com.diguage.books.concurrencycookbook.chapter1.recipe2;

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * Date: 2013-09-13
 * Time: 19:51
 */
public class Main {
    public static void main(String[] args) {
        Thread[] threads = new Thread[10];
        Thread.State[] status = new Thread.State[threads.length];

        for (int i = 0; i < threads.length; i++) {
            threads[i] = new Thread(new Calculator(i));
            if ((i % 2) == 0) {
                threads[i].setPriority(Thread.MAX_PRIORITY);
            } else {
                threads[i].setPriority(Thread.MIN_PRIORITY);
            }
            threads[i].setName("Thread-" + i);
        }

        try (FileWriter file = new FileWriter("D://thread.log");
             PrintWriter pw = new PrintWriter(file)) {
            for (int i = 0; i < threads.length; i++) {
                Thread thread = threads[i];
                pw.println("Main: Status of Thread " + i +
                        " : " + threads[i].getState());
                status[i] = threads[i].getState();
            }

            for (int i = 0; i < threads.length; i++) {
                threads[i].start();
            }

            boolean finish = false;

            while (!finish) {
                for (int i = 0; i < threads.length; i++) {
                    if (threads[i].getState() != status[i]) {
                        writeThreadInfo(pw, threads[i], status[i]);
                        status[i] = threads[i].getState();
                    }
                }
                finish = true;
                for (int i = 0; i < threads.length; i++) {
                    finish = finish
                            && (threads[i].getState() == Thread.State.TERMINATED);
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 將一個線程的狀態輸出到一個文件中。
     *
     * @param pw     PrintWriter對象
     * @param thread 需要輸出狀態的線程對象
     * @param state  線程的舊狀態
     */
    private static void writeThreadInfo(PrintWriter pw,
                                      Thread thread, Thread.State state) {
        pw.printf("Main : Id %d = %s/n",
                    thread.getId(), thread.getName());
        pw.printf("Main : Priority: %d/n", thread.getPriority());
        pw.printf("Main : Old State: %s/n", state);
        pw.printf("Main : New State: %s/n", thread.getState());
        pw.printf("Main : ********************************/n");
    }
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久久久久| 久久国产精品电影| 日韩中文字幕在线视频播放| 亚洲国产中文字幕久久网| 欧美亚洲成人免费| 亚洲美女在线看| 久久91精品国产91久久跳| 国产精品人成电影| 国产精品一区二区久久精品| 国产精品久久久久久超碰| 亚洲欧美日韩国产成人| 91精品久久久久久| 久久免费成人精品视频| 日韩在线激情视频| 欧美另类极品videosbest最新版本| 96国产粉嫩美女| 欧美在线视频一区二区| 欧美精品一区二区三区国产精品| 亚洲精品色婷婷福利天堂| 久久久久久国产免费| 欧美色视频日本版| 国产精品伦子伦免费视频| 国产精品欧美亚洲777777| 中文字幕亚洲情99在线| 久久在线免费视频| 亚洲欧美在线免费| 在线日韩av观看| 亚洲毛茸茸少妇高潮呻吟| 久久综合伊人77777蜜臀| 成人网页在线免费观看| 国产精品久久色| 欧美性猛xxx| 2019中文字幕在线| 欧美日韩免费在线观看| 成人久久18免费网站图片| 91欧美激情另类亚洲| 久久精品国产精品| 国产成人精品综合久久久| 亚洲欧洲xxxx| 国产日韩精品在线播放| 日韩av在线不卡| 国产欧美日韩专区发布| 欧美高跟鞋交xxxxhd| 日韩免费av片在线观看| 久久中文字幕视频| 亚洲欧美国产一本综合首页| 日本19禁啪啪免费观看www| 久久频这里精品99香蕉| 欧美一区二三区| 久久精彩免费视频| 久久手机精品视频| 亚洲欧美在线播放| 亚洲性日韩精品一区二区| 在线中文字幕日韩| 亚洲伊人一本大道中文字幕| 疯狂做受xxxx欧美肥白少妇| 欧美精品一区二区免费| 日本一本a高清免费不卡| 久久av红桃一区二区小说| 91po在线观看91精品国产性色| 日本在线观看天堂男亚洲| 91av国产在线| 亚洲欧美国产精品va在线观看| 欧美一级成年大片在线观看| 992tv成人免费视频| 色综合老司机第九色激情| 日韩中文字幕免费| 国产成人综合精品在线| www.xxxx欧美| 亚洲女人被黑人巨大进入al| 久久精品男人天堂| 日韩av在线精品| 久久99国产精品自在自在app| 97视频免费观看| 色悠悠久久88| 成人精品视频99在线观看免费| 亚洲理论电影网| 91精品免费视频| 亚洲无亚洲人成网站77777| 中文字幕av一区中文字幕天堂| 欧美日本国产在线| 欧美成人在线影院| 国产亚洲成av人片在线观看桃| 欧美日韩国产精品| 成人激情视频在线播放| www.色综合| 欧美放荡办公室videos4k| 日韩亚洲在线观看| 欧美www视频在线观看| 97视频在线免费观看| 久久久久久久一区二区| 97婷婷大伊香蕉精品视频| 日韩精品在线看| 97精品久久久中文字幕免费| 欧美日韩加勒比精品一区| 久久久久国色av免费观看性色| 国产精自产拍久久久久久蜜| 亚洲国产私拍精品国模在线观看| 久久免费视频网站| 久久国产精品亚洲| 91免费精品视频| 蜜臀久久99精品久久久久久宅男| 欧美日韩在线视频一区二区| 97色在线观看| 亚洲乱码国产乱码精品精| 欧美日韩在线影院| 精品国产一区二区三区在线观看| 日韩69视频在线观看| 中文字幕免费国产精品| 米奇精品一区二区三区在线观看| 亚洲欧美国产精品久久久久久久| 91精品国产成人www| 欧美电影在线免费观看网站| 国产精品视频久久| 欧美另类在线播放| 精品视频在线播放免| 中文字幕日韩高清| 国产精品xxx视频| 久久精品国产2020观看福利| 国产在线视频不卡| 91在线播放国产| 国产欧美日韩精品在线观看| 欧美一区二区三区精品电影| 亚洲视频在线视频| 日韩免费黄色av| 在线播放国产精品| 热99久久精品| 亚洲午夜未删减在线观看| 欧美亚洲免费电影| 亚洲美女在线观看| 视频在线观看99| 一本色道久久88综合日韩精品| 欧美成人免费播放| 欧美二区乱c黑人| 一本色道久久综合亚洲精品小说| 一区二区三区回区在观看免费视频| 九色成人免费视频| 国产亚洲欧洲高清| 亚洲欧洲国产伦综合| 欧美成人精品在线观看| 国产日韩精品综合网站| 欧美综合激情网| 亚洲人精品午夜在线观看| 奇米一区二区三区四区久久| xxxxx成人.com| 亚洲综合小说区| 欧美人成在线视频| 久久久久久久久久国产| 中文日韩电影网站| 久久精品国产一区二区三区| 亚洲精品国产拍免费91在线| 亚洲国产天堂久久国产91| 日韩美女视频中文字幕| 国产亚洲精品91在线| 中文字幕亚洲无线码在线一区| 久久这里只有精品99| 亚洲精品综合精品自拍| 亚洲精品久久在线| 国产欧美一区二区三区久久| 久久久国产影院| 国产a∨精品一区二区三区不卡| 一本大道亚洲视频| 高潮白浆女日韩av免费看| 欧美电影在线观看|