1. 程式人生 > >TimerTask類和Timer類的cancel()方法詳解

TimerTask類和Timer類的cancel()方法詳解

無論是TimerTask類還是Timer類,其cancel()方法都是為了清除任務佇列中的任務。雖然都是清除任務佇列中的任務,卻有一些不同:TimerTask類中的cancel()方法側重的是將自身從任務佇列中清除,其他任務不受影響,而Timer類中的cancel()方法則是將任務佇列中全部的任務清空。下面以具體示例進行演示。
TimerTask類中的cancel()方法測試:

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public
class Test { public static void main(String[] args) throws InterruptedException { System.out.println("當前時間為:" + new Date()); Calendar c = Calendar.getInstance(); Date runDate1 = c.getTime(); System.out.println("計劃時間為:" + runDate1); MyTaskA task1 = new MyTaskA(); MyTaskB task2 = new
MyTaskB(); Timer timer = new Timer(); timer.schedule(task1, runDate1, 4000); timer.schedule(task2, runDate1, 4000); } } class MyTaskA extends TimerTask { @Override public void run() { System.out.println("A run timer=" + new Date()); this.cancel();// 呼叫的是TimerTask類中的cancel()方法
System.out.println("A任務自己移除自己,B任務不受影響,繼續執行"); } } class MyTaskB extends TimerTask { @Override public void run() { System.out.println("B run timer=" + new Date()); } }

執行結果如圖 5-1所示:
這裡寫圖片描述

圖 5-1 TimerTask類中的cancel()方法測試結果

Timer類中的cancel()方法測試:

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class Test {

    public static void main(String[] args) throws InterruptedException {
        System.out.println("當前時間為:" + new Date());
        Calendar c = Calendar.getInstance();
        Date runDate1 = c.getTime();
        System.out.println("計劃時間為:" + runDate1);
        MyTaskA task1 = new MyTaskA();
        MyTaskB task2 = new MyTaskB();
        Timer timer = new Timer();
        timer.schedule(task1, runDate1, 4000);
        timer.schedule(task2, runDate1, 4000);
         Thread.sleep(12000);
         timer.cancel();
         System.out.println("A、B任務都移除了");

    }
}

class MyTaskA extends TimerTask {

    @Override
    public void run() {
        System.out.println("A run timer=" + new Date());
    }

}

class MyTaskB extends TimerTask {

    @Override
    public void run() {
        System.out.println("B run timer=" + new Date());
    }

}

執行結果如圖 5-2所示:
這裡寫圖片描述

圖 5-2 Timer類中的cancel()方法測試結果

**注意:**Timer類中的cancel()方法有時不一定會停止計劃任務,而是正常執行。下面以一個示例進行說明:

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class Test {

    public static void main(String[] args) throws InterruptedException {
        int i = 0;

        Calendar c = Calendar.getInstance();
        Date runDate1 = c.getTime();
        System.out.println("仍然有任務沒有被移除");
        while (true) {
            i++;
            Timer timer = new Timer();
            MyTaskA task1 = new MyTaskA(i);
            timer.schedule(task1, runDate1);
            timer.cancel();

        }

    }
}

class MyTaskA extends TimerTask {
    private int i;

    public MyTaskA(int i) {
        super();
        this.i = i;
    }

    @Override
    public void run() {

        System.out.println("第" + i + "次沒有被cancel取消");
    }

}

執行後部分結果如圖 5-3 所示:
這裡寫圖片描述

圖 5-3 並沒有清空佇列中的全部任務

原因是Timer類中的cancel()方法有時並沒有搶到queue鎖,則讓TimerTask類中的任務正常執行。

相關推薦

TimerTaskTimercancel()方法

無論是TimerTask類還是Timer類,其cancel()方法都是為了清除任務佇列中的任務。雖然都是清除任務佇列中的任務,卻有一些不同:TimerTask類中的cancel()方法側重的是將自身從任務佇列中清除,其他任務不受影響,而Timer類中的cance

JAVA 對象基礎知識

默認 抽象 實現 面向對象 nbsp 分組 sed fcc closed /*文章中用到的代碼只是一部分,需要源碼的可通過郵箱聯系我 [email protected]*/ 和C++一樣,JAVA也是一門面向對象的語言,其基礎和核心是類和對象。而面向對象的思想是來源與顯示生

C++11中資料成員初始化方法

C++98為類中提供類成員的初始化列表。 類物件的構造順序是這樣的:1.分配記憶體,呼叫建構函式時,隱式/顯示的初始化各資料成員 2.進入建構函式後在建構函式中執行一般計算   1.類裡面的任何成員變數在定義時是不能初始化的。   2.一般的資料成員可以在建構函式中初始化。   3.const資料成員必須在

GPRS DTU工作原理功能 DTU配置方法

端口號 一個 存儲器 端口 modem 出廠 永久 兩種 斷開 GPRS DTU 簡稱GPRS模塊,即串口服務器的無線版,其功能與串口服務器類似。利用移動和聯通遍布全國的GSM網絡,通過短信方式進行數據傳輸。那麽GPRS DTU有什麽功能呢?GPRS DTU怎麽配置?   

javascript監聽頁面重新整理頁面關閉事件方法

在我們的日常生活中,時常遇到這麼一種情況,當我們在點選一個連結、關閉頁面、表單提交時等情況,會提示我們是否確認該操作等資訊。 這裡就給大家講講javascript的onbeforeunload()和onunload()兩個事件。 相同點: 兩者都是在對頁面的關閉或重新整理事件作個操作。

Object中hashCode()equals()方法(附圖)

 下圖是規範中要求的: 圖解:比如equals相等的箭頭指向hashcode相等,標示equals相等那麼必有hashcode相等。另外有兩個箭頭指向別人的標示可能是其中之一。 //JAVA程式碼: public static void main

String構造方法

1. 構造string string實際上是模板具體化basic_string<string>的一個typedef。它有如下的建構函式。 string類的建構函式 string(cons

Arrays 的 binarySearch() 數組查詢方法

strong object tro search mage bject 技術分享 eight 獲得 Arrays類的binarySearch()方法,可以使用二分搜索法來搜索指定的數組,以獲得指定對象。該方法返回要搜索元素的索引值。binarySearch()方法提供多種重

使用Java的Graphics進行繪圖的方法

範圍 date cnblogs 兩種 size set orm 畫橢圓 true Graphics類提供基本繪圖方法,Graphics2D類提供更強大的繪圖能力。本節講解Graphics類,下節講解Graphics2D。 Graphics類提供基本的幾何圖形繪制方法,主要有

BeautifulSoup 使用select方法(通過標簽名,名, id,組合,屬性查找)

chrome red 例如 ttl app user encode and 定位 import requestsfrom bs4 import BeautifulSoupblslib="html5lib"user_agent="Mozilla/5.0 (Macintosh;

2 、實例、屬性、方法

obj tps 圖片 AD lex 間接 年齡 AS 其它 類的語法 上面的代碼其實有問題,屬性名字和年齡都寫死了,想傳名字傳不進去。 1 class Person(object): 2   def __init__(self, name, age): 3     se

TestNG Assert方法

類方法 null cep 進行 ots ces 一個 遍歷數組 spa package com.testng.examples;import org.testng.Assert;import org.testng.annotations.Test;public class

Java-Parameter常用方法

這次主要整理下Java中Parameter類的常用方法 一、Parameter類的定義 Parameter類位於 java.lang.reflect 包中,主要用於在程式執行狀態中,動態地獲取方法引數資訊 在jdk8之前,編譯器會忽略我們編寫程式碼時設定的引數

BufferendReaderBufferedWriter方法說明

一.BufferedWriter類 構造方法: bufferedWriter bf = new bufferedWriter(Writer out ); 主要方法: void write(char ch);//寫入單個字元。 void write(char []cbuf,in

手把手教你ExtJS從入門到放棄——篇二十四(示例21:Ext.dom.Element中操作樣式方法

只挑幾個講解: applyStyle:引數可以是如下形式,也可以是物件形式:物件的屬性為樣式如{width:300px},或者是個方法,返回值形式為 前面兩種 setStyle:跟jquery裡的css方法一樣,第一個引數是樣式屬性的key,第二個是值

手把手教你ExtJS從入門到放棄——篇二十三(示例20:Ext.dom.Element中常用增刪改查方法

方法多多,就講部分常用的 查詢系: onReady就不寫了,上核心程式碼 contains:引數可以傳id或者元素 、 child:返回該元素的子元素 down(選擇器):根據選擇器獲取該元素下層內層元素(常用) first:獲取第一個子元素

人家的Python資料庫連線sql語句拼接方法

原文出處: sql拼接方法 # encoding=utf-8 from django.http import HttpResponse from anyjson import serialize from django.http import HttpRespon

自動載入方法

在瞭解這個函式之前先來看另一個函式:__autoload。 一、__autoload 這是一個自動載入函式,在PHP5中,當我們例項化一個未定義的類時,就會觸發此函式。看下面例子: printit.class.php <?php class PRINTIT { function do

Java-Modifier常用方法

這次主要整理下Java中Modifier類的常用方法 一、Modifier類的定義 Modifier類 (修飾符工具類) 位於 java.lang.reflect 包中,用於判斷和獲取某個類、變數或

“全棧2019”Java第五十九章:抽象與抽象方法

難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第五十九章:抽象類與抽象方法詳解 下一章 “全棧2019”Java第六十章:如何定義介面