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

java中的Timer和Timertask的關(guān)系解讀

 更新時間:2024年12月23日 17:17:00   作者:健康平安的活著  
本文詳細介紹了Java中的Timer和TimerTask類,包括它們之間的關(guān)系、API的使用方法、注意事項以及操作案例,Timer是一個調(diào)度器,而TimerTask是具體的任務(wù)類,Timer僅對應(yīng)一個線程,不保證任務(wù)執(zhí)行的精確性,但線程安全,一個Timer可以調(diào)度多個TimerTask

一 time和timertask的關(guān)系

1.1 timer和timertask關(guān)系

1.Timer來講就是一個調(diào)度器,而TimerTask呢只是一個實現(xiàn)了run方法的一個類;

2.Timer和TimerTask成對出現(xiàn),Timer是定時器,TimerTask是定時任務(wù)。換句話說,定時任務(wù)TimerTask是給定時器Timer執(zhí)行的具體任務(wù)。TimerTask實現(xiàn)Runnable接口的run方法。

Java的定時器Timer和定時任務(wù)TimerTask應(yīng)用以及原理

3.每一個Timer僅對應(yīng)唯一一個線程。Timer不保證任務(wù)執(zhí)行的十分精確。Timer類的線程安全的。

4.一個Timer可以調(diào)度任意多個TimerTask,所有任務(wù)都存儲在一個隊列中順序執(zhí)行,如果需要多個TimerTask并發(fā)執(zhí)行,則需要創(chuàng)建兩個多個Timer。

一個Timer可以執(zhí)行多個TimerTask,但一個TimerTask只能被一個Timer使用(這和schedule中校驗TimerTask的狀態(tài)有關(guān),TimerTask的生命周期(由不同的狀態(tài)確定))。

簡單的說Timer中有兩個核心部分:

TimerThread是時間線程,控制TaskQueue中TimerTask的執(zhí)行;

TaskQueue是一個工具類,管理TimerTask數(shù)組

1.2 timer的api

無參構(gòu)造方法,簡單通過Tiemer為前綴構(gòu)造一個線程名稱

有參構(gòu)造方法,傳入了是否為后臺線程,后臺線程當(dāng)且僅當(dāng)進程結(jié)束時,自動注銷掉。

1.3 終止Timer線程

默認情況下,創(chuàng)建的timer線程會一直執(zhí)行,主要有下面四種方式來終止timer線程:

1) 調(diào)用Timer.cancle()方法??梢栽诔绦蛉魏蔚胤秸{(diào)用,甚至在TimerTask中的run方法中調(diào)用;

2) 創(chuàng)建Timer時定義位daemon守護線程,使用new Timer(true)語句;

3) 設(shè)置Timer對象為null,其會自動終止;????有待考證

4) 調(diào)用System.exit方法,整個程序終止。

1.4 timer注意事項

1) Timer線程不會捕獲異常,所以TimerTask拋出的未檢查的異常會終止timer線程。如果Timer線程中存在多個計劃任務(wù),其中一個計劃任務(wù)拋出未檢查的異常,則會引起整個Timer線程結(jié)束,從而導(dǎo)致其他計劃任務(wù)無法得到繼續(xù)執(zhí)行。  

2) Timer線程時基于絕對時間(如:2023/02/14 16:06:00),因此計劃任務(wù)對系統(tǒng)的時間的改變是敏感的。

3) Timer是單線程,如果某個任務(wù)很耗時,可能會影響其他計劃任務(wù)的執(zhí)行。

因此,JDK1.5以上建議使用ScheduledThreadPoolExecutor來代替Timer執(zhí)行計劃任務(wù)。

二 操作案例

2.1 一個Timer執(zhí)行多個Task,堵塞現(xiàn)象

package com.ljf.lockdemo.task.timerdemo;

import java.util.Timer;
import java.util.TimerTask;

/**
 * @ClassName: TestDemo2
 * @Description: TODO
 * @Author: admin
 * @Date: 2024/03/02 11:30:06 
 * @Version: V1.0
 **/
public class TestDemo2 {
    public static void main(String[] args) {
        TimerTask task1=new TimerTask() {
            @Override
            public void run() {
                String name = Thread.currentThread().getName();
                System.out.println("[當(dāng)前線程是:"+name+",執(zhí)行定時任務(wù)1:"+System.currentTimeMillis()+"]");
            }
        };

        TimerTask task2=new TimerTask() {
            @Override
            public void run() {
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                String name = Thread.currentThread().getName();
                System.out.println("[當(dāng)前線程是:"+name+",執(zhí)行定時任務(wù)2:"+System.currentTimeMillis()+"]");
            }
        };


        Timer timer=new Timer();
        timer.schedule(task2,10000);
        timer.schedule(task1,100,3000);

    }
}

結(jié)果:

2.2 異常現(xiàn)象

現(xiàn)象操作,在timetask2中,模擬一個除以0的算術(shù)異常。

強調(diào):在執(zhí)行任何一個任務(wù)的run方法時,一旦run拋出了異常,Timer線程就會退出,從而所有定時任務(wù)都會被取消。如果希望各個定時任務(wù)互不干擾,一定要在run方法內(nèi)捕獲所有異常。

這里catch的異常為:integerrupteException

改成Exceptione 如圖

啟動兩個timer

總結(jié)

1個timer沒有cancel掉,使用的一直是一個線程id;1個timer關(guān)閉后,再每次new后,使用的線程id都不相同。

在1個timer中,開啟兩個timetask;這個兩個timertask串行執(zhí)行,單線程;使用的線程id是相同的。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用springboot單例模式與線程安全問題踩的坑

    使用springboot單例模式與線程安全問題踩的坑

    這篇文章主要介紹了使用springboot單例模式與線程安全問題踩的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java并發(fā)Futures和Callables類實例詳解

    Java并發(fā)Futures和Callables類實例詳解

    Callable對象返回Future對象,該對象提供監(jiān)視線程執(zhí)行的任務(wù)進度的方法, Future對象可用于檢查Callable的狀態(tài),然后線程完成后從Callable中檢索結(jié)果,這篇文章給大家介紹Java并發(fā)Futures和Callables類的相關(guān)知識,感興趣的朋友一起看看吧
    2024-05-05
  • shiro之INI配置詳解

    shiro之INI配置詳解

    這篇文章主要為大家詳細介紹了shiro之INI配置的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • springboot下使用shiro自定義filter的個人經(jīng)驗分享

    springboot下使用shiro自定義filter的個人經(jīng)驗分享

    這篇文章主要介紹了springboot下使用shiro自定義filter的個人經(jīng)驗,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 前端dist包放到后端springboot項目下一起打包圖文教程

    前端dist包放到后端springboot項目下一起打包圖文教程

    這篇文章主要介紹了前端dist包放到后端springboot項目下一起打包的相關(guān)資料,具體步驟包括前端打包、將前端文件復(fù)制到后端項目的static目錄、后端打包、驗證部署成功等,需要的朋友可以參考下
    2025-01-01
  • java實現(xiàn)時間控制的幾種方案

    java實現(xiàn)時間控制的幾種方案

    這篇文章主要介紹了java實現(xiàn)時間控制的幾種方案,本文從多個方面給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-07-07
  • Java如何使用逆波蘭式(后綴表達式)計算表達式的值

    Java如何使用逆波蘭式(后綴表達式)計算表達式的值

    這篇文章主要介紹了Java如何使用逆波蘭式(后綴表達式)計算表達式的值,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • PowerJob的DesignateServer工作流程源碼解讀

    PowerJob的DesignateServer工作流程源碼解讀

    這篇文章主要介紹了PowerJob的DesignateServer工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • 關(guān)于SpringGateway調(diào)用服務(wù) 接受不到參數(shù)問題

    關(guān)于SpringGateway調(diào)用服務(wù) 接受不到參數(shù)問題

    這篇文章主要介紹了關(guān)于SpringGateway調(diào)用服務(wù)接受不到參數(shù)問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Java 泛型 Generic機制實例詳解

    Java 泛型 Generic機制實例詳解

    這篇文章主要為大家介紹了Java 泛型 Generic機制實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11

最新評論