欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2014年12月05日 10:18:43   投稿:junjie  
這篇文章主要介紹了Java并發(fā)編程示例(五):線程休眠與恢復(fù),在本節(jié),我們將開(kāi)發(fā)一個(gè)程序,使用sleep()方法來(lái)實(shí)現(xiàn)每秒鐘打印一次當(dāng)前時(shí)間,需要的朋友可以參考下

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

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

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

知其然

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

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

復(fù)制代碼 代碼如下:

public class FileClock implements Runnable {

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

@Override
public void run() {

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

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)有了實(shí)現(xiàn)好的線程類?,F(xiàn)在,我們來(lái)實(shí)現(xiàn)主類。創(chuàng)建一個(gè)名為FileMain的類,并且實(shí)現(xiàn)main()方法。代碼如下:

復(fù)制代碼 代碼如下:

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

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

復(fù)制代碼 代碼如下:

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

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

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

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

復(fù)制代碼 代碼如下:

thread.interrupt();

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

知其所以然

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

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

當(dāng)休眠中的線程被中斷時(shí),會(huì)立即拋出一個(gè)InterruptedException,而不是等到休眠結(jié)束。

永無(wú)止境

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

拿來(lái)主義

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

小有所成

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

FileClock類的完整代碼

復(fù)制代碼 代碼如下:

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

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

/**
 * 每秒向控制臺(tái)打印出當(dāng)前日期和時(shí)間。
 * 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類的完整代碼

復(fù)制代碼 代碼如下:

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

import java.util.concurrent.TimeUnit;

/**
 * 演示線程休眠和恢復(fù)
 * 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();
    }
}

相關(guān)文章

  • java中hibernate二級(jí)緩存詳解

    java中hibernate二級(jí)緩存詳解

    本篇文章中主要介紹了java中hibernate二級(jí)緩存詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • Java Annotation Overview詳解

    Java Annotation Overview詳解

    這篇文章主要介紹了Java Annotation Overview,需要的朋友可以參考下
    2014-02-02
  • Response如何實(shí)現(xiàn)重定向

    Response如何實(shí)現(xiàn)重定向

    這篇文章主要介紹了Response如何實(shí)現(xiàn)重定向方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • IDEA使用properties配置文件進(jìn)行mysql數(shù)據(jù)庫(kù)連接的教程圖解

    IDEA使用properties配置文件進(jìn)行mysql數(shù)據(jù)庫(kù)連接的教程圖解

    Properties類是 鍵和值均為字符串的可以永久存儲(chǔ)到文件中的key-value集合。這篇文章主要介紹了IDEA使用properties配置文件進(jìn)行mysql數(shù)據(jù)路連接 ,需要的朋友可以參考下
    2018-10-10
  • SpringCloud中的Consul詳解

    SpringCloud中的Consul詳解

    這篇文章主要介紹了SpringCloud中的Consul知識(shí),本文使用的是docker-compose方式管理consul服務(wù),直接啟動(dòng)即可,需要的朋友可以參考下
    2022-03-03
  • Mybatis + js 實(shí)現(xiàn)下拉列表二級(jí)聯(lián)動(dòng)效果

    Mybatis + js 實(shí)現(xiàn)下拉列表二級(jí)聯(lián)動(dòng)效果

    這篇文章給大家介紹基于Mybatis + js 實(shí)現(xiàn)下拉列表二級(jí)聯(lián)動(dòng)效果,實(shí)現(xiàn)代碼分為前端界面實(shí)現(xiàn)和后端處理方法,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-06-06
  • 基于Java信號(hào)量解決死鎖過(guò)程解析

    基于Java信號(hào)量解決死鎖過(guò)程解析

    這篇文章主要介紹了基于Java信號(hào)量解決死鎖過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Java數(shù)組的特性_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java數(shù)組的特性_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    數(shù)組是基本上所有語(yǔ)言都會(huì)有的一種數(shù)據(jù)類型,它表示一組相同類型的數(shù)據(jù)的集合,具有固定的長(zhǎng)度,并且在內(nèi)存中占據(jù)連續(xù)的空間。在C,C++等語(yǔ)言中,數(shù)組的定義簡(jiǎn)潔清晰,而在Java中確有一些會(huì)讓人迷惑的特性。本文就嘗試分析這些特性
    2017-04-04
  • 詳解springboot整合mongodb

    詳解springboot整合mongodb

    本篇文章主要介紹了詳解springboot整合mongodb,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • java 中的instanceof用法詳解及instanceof是什么意思(推薦)

    java 中的instanceof用法詳解及instanceof是什么意思(推薦)

    instanceof 是 Java 的保留關(guān)鍵字。它的作用是測(cè)試它左邊的對(duì)象是否是它右邊的類的實(shí)例,返回 boolean 的數(shù)據(jù)類型。接下來(lái)通過(guò)本文給大家介紹java 中的instanceof用法詳解及instanceof是什么意思,需要的朋友參考下吧
    2017-11-11

最新評(píng)論