国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java并發(fā)編程示例(五):線程休眠與恢復

2019-11-26 15:20:37
字體:
供稿:網(wǎng)友

有時,我們需要在指定的時間點中斷正在執(zhí)行的線程。比如,每分鐘檢查一次傳感器狀態(tài)的線程,其余時間,線程不需要做任何事情。在此期間,線程不需要使用計算機的任何資源。過了這段時間之后,并且當Java虛擬機調(diào)度了該線程,則該線程繼續(xù)執(zhí)行。為此,你可以使用Thread類的sleeep()方法。該方法以休眠的方式來推遲線程的執(zhí)行,而且整數(shù)類型的參數(shù)則指明休眠的毫秒數(shù)。當調(diào)用sleep()方法,休眠時間結(jié)束后,Java虛擬機分配給線程CPU運行時間,線程就會繼續(xù)執(zhí)行。

另一種是用sleep()方法的方式是通過枚舉類型TimeUnit的元素。該方式使用Thread的sleep()方法來使得當前線程進行休眠,它可以接受指定單位的時間作為參數(shù),并將這些其轉(zhuǎn)換成對應的毫秒數(shù)。

在本節(jié),我們將開發(fā)一個程序,使用sleep()方法來實現(xiàn)每秒鐘打印一次當前時間。

知其然

按照下面所示步驟,來實現(xiàn)本節(jié)示例。

1.創(chuàng)建一個名為FileClock的類,并且實現(xiàn)Runnable接口。代碼如下:

復制代碼 代碼如下:

public class FileClock implements Runnable {

2.實現(xiàn)run()方法。代碼如下:
復制代碼 代碼如下:

@Override
public void run() {

3.寫一個遍歷十次的循環(huán),在每次迭代中,創(chuàng)建一個Date對象,并將其打印到控制臺。然后,通過TimeUtil的SECONDS屬性調(diào)用sleep()方法,來延遲一秒鐘執(zhí)行線程。以為sleep()方法會拋出InterruptedException異常。所以,我們需要多寫幾行代碼,用來捕獲異常。當線程可能中斷是,釋放或者關(guān)閉在線程中使用的資源,總是最佳實踐。代碼如下:
復制代碼 代碼如下:

for (int i = 0; i < 10; i++) {
    System.out.printf("%s/n", new Date());
    try {
        TimeUnit.SECONDS.sleep(1);
    } catch (InterruptedException e) {
        System.out.printf("The FileClock has been interrupted./n");
    }
}

4.我們已經(jīng)有了實現(xiàn)好的線程類。現(xiàn)在,我們來實現(xiàn)主類。創(chuàng)建一個名為FileMain的類,并且實現(xiàn)main()方法。代碼如下:

復制代碼 代碼如下:

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

5.創(chuàng)建一個FileClock對象,再創(chuàng)建一個線程用于執(zhí)行任務(wù)。然后,啟動線程。代碼如下:

復制代碼 代碼如下:

FileClock clock = new FileClock();
Thread thread = new Thread(clock);
thread.start();

6.在主線程中,通過TimeUtil的SECONDS屬性調(diào)用sleep()方法,來等待五秒鐘。代碼如下:
復制代碼 代碼如下:

try {
    TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
    e.printStackTrace();
}

7.中斷FileClock線程。代碼如下:

復制代碼 代碼如下:

thread.interrupt();

8.執(zhí)行示例,查看執(zhí)行效果。

知其所以然

當執(zhí)行這個程序時,會發(fā)現(xiàn),程序如何每秒鐘打印一次日期對象,以及線程被中斷的情況。

當調(diào)用sleep()方法時,線程將離開CPU,并停止執(zhí)行一段時間。在這段時間內(nèi),線程不需要CPU了,所以CPU可以執(zhí)行其他任務(wù)。

當休眠中的線程被中斷時,會立即拋出一個InterruptedException,而不是等到休眠結(jié)束。

永無止境

Java并發(fā)API中,還有另外一個方法可以讓線程讓出CPU。這就是yield()方法,調(diào)用該方法就是想Java虛擬機發(fā)送消息說明線程可以讓出CPU給其他線程。Java虛擬機并不保證響應這個請求。一般情況下,該方法僅僅在調(diào)試程序時使用。

拿來主義

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

小有所成

本節(jié)所用的示例代碼的完整版。

FileClock類的完整代碼

復制代碼 代碼如下:

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

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

/**
 * 每秒向控制臺打印出當前日期和時間。
 * Date: 2013-09-18
 * Time: 23:11
 */
public class FileClock implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.printf("%s/n", new Date());
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                System.out.printf("The FileClock has been interrupted./n");
            }
        }
    }

FileMain類的完整代碼

復制代碼 代碼如下:

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

import java.util.concurrent.TimeUnit;

/**
 * 演示線程休眠和恢復
 * Date: 2013-09-19
 * Time: 00:29
 */
public class FileMain {
    public static void main(String[] args) {
        FileClock clock = new FileClock();
        Thread thread = new Thread(clock);
        thread.start();

        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        thread.interrupt();
    }
}

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 南投县| 朝阳区| 嘉鱼县| 繁昌县| 贡嘎县| 莎车县| 民权县| 体育| 平度市| 花莲县| 郎溪县| 儋州市| 连江县| 新沂市| 松溪县| 龙陵县| 隆昌县| 临高县| 福贡县| 筠连县| 封开县| 庆云县| 卓资县| 化德县| 德阳市| 无为县| 永和县| 南木林县| 舞阳县| 房产| 庆阳市| 博爱县| 沐川县| 雅江县| 盐源县| 通化市| 南陵县| 金山区| 萨迦县| 额敏县| 湖南省|