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類中的任務正常執行。
相關推薦
TimerTask類和Timer類的cancel()方法詳解
無論是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之前,編譯器會忽略我們編寫程式碼時設定的引數
BufferendReader類和BufferedWriter類方法說明
一.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第六十章:如何定義介面