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

首頁 > 編程 > Java > 正文

Java并發編程示例(七):守護線程的創建和運行

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

Java有一種特殊線程,守護線程,這種線程優先級特別低,只有在同一程序中的其他線程不執行時才會執行。

由于守護線程擁有這些特性,所以,一般用為為程序中的普通線程(也稱為用戶線程)提供服務。它們一般會有一個無限循環,或用于等待請求服務,或用于執行任務等。它們不可以做任何重要的工作,因為我們不確定他們什么時才能分配到CPU運行時間,而且當沒有其他線程執行時,它們就會自動終止。這類線程的一個典型應用就是Java的垃圾回收。

在本節示例中,我們將創建兩個線程,一個是普通線程,向隊列中寫入事件;另外一個是守護線程,清除隊列中的事件,刪除存在時間超過10秒的事件。

知其然

按照如下步驟,實現示例程序。

1.創建Event類,該類僅僅用于保存程序執行所需的事件信息。聲明兩個屬性,一個是java.util.Date類型的的date熟悉,另外一個是String類型的event屬性;然后生成這兩個屬性的讀寫方法。代碼如下:

復制代碼 代碼如下:

public class Event {
    private Date date;
    private String event;

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public String getEvent() {
        return event;
    }

    public void setEvent(String event) {
        this.event = event;
    }
}

2.創建一個名為WriterTask的類,并且實現Runnable接口。代碼如下:

復制代碼 代碼如下:

public class WriterTask implements Runnable {

3.聲明一個用來存儲事件的隊列屬性,實現類的構造函數,并且利用其參數來初始化隊列屬性。代碼如下:

復制代碼 代碼如下:

private Deque<Event> deque;

public WriterTask(Deque<Event> deque) {
    this.deque = deque;
}

4.實現該任務的run()方法,方法中含有一個遍歷100次的循環。在每次遍歷中,創建一個新的Event對象,然后保存到隊列中,再睡眠1秒鐘。代碼如下:

復制代碼 代碼如下:

@Override
public void run() {
    for (int i = 0; i < 100; i++) {
        Event event = new Event();
        event.setDate(new Date());
        event.setEvent(String.format("The thread %s has generated an event",
                Thread.currentThread().getId()));
        deque.addFirst(event);
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

5.創建一個名為CleanerTask的類,并繼承Thread類。代碼如下:

復制代碼 代碼如下:

public class CleanerTask extends Thread {

6.聲明一個用來存儲事件的隊列屬性,實現類的構造函數,并且利用其參數來初始化隊列屬性。在構造方法中,通過調用setDaemon()方法,將該線程設置為守護線程。代碼如下:

復制代碼 代碼如下:

private Deque<Event> deque;

public CleanerTask(Deque<Event> deque) {
    this.deque = deque;
    setDaemon(true);
}

7.實現run()方法,方法體內有一個無限循環,用于獲取當前時間,然后調用clearn()方法。代碼如下:

復制代碼 代碼如下:

@Override
public void run() {
    while (true) {
        Date date = new Date();
        clean(date);
    }
}

8.實現clean()方法,在該方法內,獲取最后面的一個時間,然后檢查時間時間和當前時間的時間差,如果在10秒鐘之前創建的,則刪除當前事件,再檢查下一個事件。如果有事件被刪除,則顯示打印出被刪除事件的信息,然后還將打印出隊列的最新長度,這樣就可以觀察到程序的執行進展。代碼如下:

復制代碼 代碼如下:

private void clean(Date date) {
    long difference;
    boolean delete;

    if (deque.size() == 0) {
        return;
    }

    delete = false;
    do {
        Event e = deque.getLast();
        difference = date.getTime() - e.getDate().getTime();
        if (difference > 10000) {
            System.out.printf("Cleaner: %s/n", e.getDate());
            deque.removeLast();
            delete = true;
        }
    } while (difference > 10000);

    if (delete) {
        System.out.printf("Clearner: Size of the queue: %d/n", deque.size());
    }
}

9.創建程序的主類,Main類,然后實現main()方法。代碼如下:

復制代碼 代碼如下:

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

10.使用Deque類創建存儲事件的隊列。代碼如下:

復制代碼 代碼如下:

Deque<Event> deque = new ArrayDeque<>();

11.創建并啟動三個WriterTask線程和一個CleanerTask線程。代碼如下:

復制代碼 代碼如下:

Deque<Event> deque = new ArrayDeque<>();
WriterTask writer = new WriterTask(deque);
for (int i = 0; i < 3; i++) {
    Thread thread = new Thread(writer);
    thread.start();
}

CleanerTask cleaner = new CleanerTask(deque);
cleaner.start();

12.執行程序,查看執行結果。

知其所以然

分析程序的執行結果就可以看出,隊列先增加到30,然后就在27到30之間變化,知道程序執行結束。

程序首先從三個WriterTask線程開始執行,每個線程先隊列增加一個事件,然后睡眠1秒鐘。在前10秒過后,在隊列中將存在三十個事件。在這10秒期間,當三個WriterTask線程都睡眠時,CleanerTask線程也會運行,但是不會刪除任何事件,因為所有的事件的生成時間還不超過10秒。在前10秒過后的時間里,每秒鐘三個WriterTask向隊列中添加三個事件;同樣,CleanerTask每秒會刪除三個事件。所以,事件的數目在27到30之間徘徊。

當WriterTask線程都休眠時,我們就可以自由處理時間,這段時間讓守護線程得以運行。如果將WriterTask線程的睡眠時間設置得更短一點,那么CleanerTask線程將獲取更少的CPU運行時間。果真如此的話,因為CleanerTask線程一直得不到足夠的運行時間不能用于刪除足夠的事件,隊列的長度將會一直增長下去。

永無止境

僅能在調用start()方法之前,通過調用setDaemon()方法將線程設置為守護線程。一旦線程開始運行,則不能修改守護狀態。

還可以使用isDaemon()來檢查一個線程是否為守護線程。如果是守護線程,則返回true;如果是普通線程,則返回false。

拿來主義

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

小有所成

本節所用的所有示例代碼的完整版。

Event類的完整代碼

復制代碼 代碼如下:

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

import java.util.Date;

/**
 * 事件信息類
 * Date: 2013-09-19
 * Time: 22:56
 */
public class Event {
    private Date date;
    private String event;

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public String getEvent() {
        return event;
    }

    public void setEvent(String event) {
        this.event = event;
    }
}

WriterTask類的完整代碼

復制代碼 代碼如下:

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

import java.util.Date;
import java.util.Deque;
import java.util.concurrent.TimeUnit;

/**
 * 每秒生成一個事件。
 * Date: 2013-09-19
 * Time: 22:59
 */
public class WriterTask implements Runnable {
    private Deque<Event> deque;

    public WriterTask(Deque<Event> deque) {
        this.deque = deque;
    }

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            Event event = new Event();
            event.setDate(new Date());
            event.setEvent(String.format("The thread %s has generated an event",
                    Thread.currentThread().getId()));
            deque.addFirst(event);
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

CleanerTask類的完整代碼

復制代碼 代碼如下:

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

import java.util.Date;
import java.util.Deque;

/**
 * 事件清理
 * Date: 2013-09-19
 * Time: 23:33
 */
public class CleanerTask extends Thread {
    private Deque<Event> deque;

    public CleanerTask(Deque<Event> deque) {
        this.deque = deque;
        setDaemon(true);
    }

    @Override
    public void run() {
        while (true) {
            Date date = new Date();
            clean(date);
        }
    }

    /**
     * 刪除事件。
     *
     * @param date
     */
    private void clean(Date date) {
        long difference;
        boolean delete;

        if (deque.size() == 0) {
            return;
        }

        delete = false;
        do {
            Event e = deque.getLast();
            difference = date.getTime() - e.getDate().getTime();
            if (difference > 10000) {
                System.out.printf("Cleaner: %s/n", e.getDate());
                deque.removeLast();
                delete = true;
            }
        } while (difference > 10000);

        if (delete) {
            System.out.printf("Clearner: Size of the queue: %d/n", deque.size());
        }
    }
}

Main類的完整代碼

復制代碼 代碼如下:

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

import java.util.ArrayDeque;
import java.util.Deque;

/**
 * Date: 2013-09-19
 * Time: 23:54
 */
public class Main {
    public static void main(String[] args) {
        Deque<Event> deque = new ArrayDeque<>();
        WriterTask writer = new WriterTask(deque);
        for (int i = 0; i < 3; i++) {
            Thread thread = new Thread(writer);
            thread.start();
        }

        CleanerTask cleaner = new CleanerTask(deque);
        cleaner.start();
    }
}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产又爽又黄的激情精品视频| 欧美精品一二区| 国产精品扒开腿做爽爽爽视频| 亚洲高清久久网| 岛国av一区二区| 亚洲国产精品一区二区三区| 日韩电影免费观看在线观看| 亚洲国产欧美一区二区丝袜黑人| 国产精品中文字幕在线观看| 欧美大尺度激情区在线播放| 亚洲欧美在线磁力| 亚洲最大福利视频网| 美女撒尿一区二区三区| 日韩av影片在线观看| 日韩欧美中文字幕在线观看| 久久久久久久电影一区| 亚洲永久免费观看| 91福利视频在线观看| 精品美女永久免费视频| 精品久久久久久久中文字幕| 日韩免费看的电影电视剧大全| 狠狠色狠色综合曰曰| 欧美色videos| 日韩美女视频免费看| 亚洲免费成人av电影| 精品久久久999| 久久天天躁狠狠躁老女人| 国产97色在线|日韩| 久久久久久久国产精品视频| 亚洲精品午夜精品| 国产精品极品美女粉嫩高清在线| www国产91| 亚洲女人初尝黑人巨大| 国产精品美女久久久免费| 久久久久久久久久久免费| 亚洲精品日韩av| 成人黄色在线观看| 亚洲人成伊人成综合网久久久| 国产91av在线| 日韩精品视频免费专区在线播放| 富二代精品短视频| 这里只有精品视频在线| 97精品国产97久久久久久免费| 欧美国产日韩一区二区在线观看| 欧美黄色性视频| 91黑丝高跟在线| 久久精品亚洲国产| 日韩免费在线观看视频| 久热在线中文字幕色999舞| 久久久亚洲精选| 亚洲国产精品人人爽夜夜爽| 国产精品久久久久久久天堂| 国产精品视频久久| 国产欧美精品在线播放| 2018中文字幕一区二区三区| 久久97精品久久久久久久不卡| 俺去了亚洲欧美日韩| 亚洲精品欧美一区二区三区| 日韩av电影中文字幕| 亚洲高清福利视频| 欧美日韩精品在线播放| 亚洲综合中文字幕在线| 欧美成人精品三级在线观看| 2020欧美日韩在线视频| 不卡在线观看电视剧完整版| 精品免费在线观看| 亚洲欧美日韩中文在线制服| 久久免费精品日本久久中文字幕| 国产99在线|中文| 欧美影院在线播放| zzjj国产精品一区二区| 精品视频在线观看日韩| 97视频在线观看播放| 97在线日本国产| 91久久综合亚洲鲁鲁五月天| 欧美精品videosex牲欧美| 日韩av中文字幕在线| 久久久中精品2020中文| 国产日产欧美精品| 日韩免费在线免费观看| 亚洲人成网在线播放| 欧美激情伊人电影| 欧美一级视频在线观看| 国产成人精品在线视频| 国产区精品在线观看| xvideos亚洲人网站| 成人午夜两性视频| 午夜欧美大片免费观看| 亚洲最大中文字幕| 97涩涩爰在线观看亚洲| 欧美国产视频日韩| 欧美中文在线字幕| 亚洲欧美精品suv| 日韩中文在线中文网三级| 国产精品视频999| 精品国产欧美一区二区三区成人| 欧美日韩中文字幕在线视频| 91性高湖久久久久久久久_久久99| 亚洲电影中文字幕| 九九热精品在线| 亚洲一区二区福利| 日韩中文字幕在线| 国产91精品最新在线播放| 国产欧美精品一区二区三区介绍| 91国内免费在线视频| 久久免费视频在线| 91精品久久久久久久久青青| 国产成人中文字幕| 日韩在线观看免费高清完整版| 一本色道久久88综合日韩精品| 国产亚洲精品美女久久久| 欧美性猛交丰臀xxxxx网站| 岛国av一区二区在线在线观看| 亚洲欧美一区二区三区四区| 亚洲第一精品自拍| 亚洲欧美激情另类校园| 一区二区三区在线播放欧美| 日韩av影片在线观看| www国产亚洲精品久久网站| 欧洲美女7788成人免费视频| 亚洲一区二区久久久久久| 亚洲xxxx视频| 国产精品电影久久久久电影网| 日韩欧美在线观看| 成人黄色av播放免费| 亚洲无av在线中文字幕| 亚洲欧洲国产一区| 国内精品小视频在线观看| 久久久久久久一区二区三区| 成人性生交大片免费看视频直播| 欧美另类高清videos| 92版电视剧仙鹤神针在线观看| 精品无人国产偷自产在线| 成人h片在线播放免费网站| 欧美性猛交xxxx乱大交极品| 性欧美暴力猛交69hd| 欧美午夜宅男影院在线观看| 亚洲在线免费视频| 久久九九亚洲综合| 亚洲综合日韩中文字幕v在线| 在线中文字幕日韩| 亚洲免费人成在线视频观看| 欧美极品少妇xxxxⅹ免费视频| 欧美老少配视频| 欧美国产极速在线| 亚洲日本欧美中文幕| 国产精品香蕉在线观看| 中文字幕亚洲一区二区三区五十路| 久久国产精品偷| 欧美激情xxxx性bbbb| 欧美高清在线视频观看不卡| 国模吧一区二区三区| 欧美高清激情视频| 欧美激情二区三区| 亚洲japanese制服美女| 国产精品第三页| 欧美影院久久久| 亚洲偷欧美偷国内偷| 久久躁狠狠躁夜夜爽| 久久99久久久久久久噜噜| xxav国产精品美女主播| 日韩国产欧美精品一区二区三区| 亚洲国产精品电影| 欧美综合第一页|