java定時器類Timer和多執行緒介紹及例項
任務要求:
- 完成一個java application應用程式,使用定時器程式設計,在實時顯示當前時間,每1秒時鐘內容更新一次。
- 完成一個java application應用程式,在應用程式主程序中新開一個執行緒,此執行緒進行死迴圈,每1秒被啟用一次,啟用時即在輸出顯示當前時間。
- 完成一個java application應用程式,此應用程式公共類有一個double型類屬性(變數)x,初始值為0;在應用程式主程序中新開兩個執行緒,這兩個執行緒都進行死迴圈;第1個執行緒每隔300ms啟用一次,令類屬性x自加1.0並輸出顯示;第2個執行緒每隔400ms啟用一次,令類屬性x自加0.1並輸出顯示。
一、定時器類Timer
(一)介紹
Time類主要負責完成定時計劃任務的功能,就是在指定的時間的開始執行某個任務.
Timer類的作用是設定計劃任務,而封裝任務內容的類是TimerTask類.此類是一個抽象類,繼承需要實現一個run方法.
Timer建構函式:
Timer的方法:
(二)例項:使用定時器程式設計,在實時顯示當前時間,每1秒時鐘內容更新一次。
任務步驟:
1.建立一個Timer物件;
2.建立MyTask類繼承自TimerTask,在MyTask類中定義run方法,具體任務的實現寫在run方法中;
3.通過Timer提供的schedule()方法實現定時.
程式碼如下:
import java.util. Timer;
import java.util.TimerTask;
import java.util.Date;
import java.text.SimpleDateFormat;
class MyTask extends TimerTask
{
@Override//驗證@Override下面的方法名是否是父類中所有的,如果沒有則報錯
public void run() //run方法
{
Date date =new Date();//初始化date物件
SimpleDateFormat ft=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss" );//日期格式化
System.out.println("當前時間:"+ft.format(date));
}
}
class TimerDemo
{
public static void main(String[] args)
{
Timer t=new Timer();//建立定時器Timer物件
MyTask task=new MyTask();//建立MyTask類
t.scheduleAtFixedRate(task,0, 1000); //間隔1秒的速率執行MyTask類中的run方法
}
}
結果如下:
注:
SimpleDateFormat 是一個以語言環境敏感的方式來格式化和分析日期的類。SimpleDateFormat 允許你選擇任何使用者自定義日期時間格式來執行 。
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
這一行程式碼確立了轉換的格式,其中 yyyy 是完整的公元年,MM 是月份,dd 是日期,HH:mm:ss 是時、分、秒。(有的格式大寫,有的格式小寫,例如 MM 是月份,mm 是分;HH 是 24 小時制,而 hh 是 12 小時制。)
二.多執行緒
(一)介紹
什麼是執行緒?
在同一個程序中可以執行多個任務,每一個任務可以看做一個執行緒.
執行緒是程式的執行單元,執行路徑,使程式使用cpu的最基本單位
一個程序如果只有一條執行路徑,那麼就是單執行緒的
一個程序如果有多個執行路徑,那麼就是多執行緒的
多執行緒的意義:
多程序的存在是為了提高CPU的利用率,多執行緒的存在,不是為了提高程式的執行速度,而是為了提高應用程式的使用率.
程式的執行其實都是在搶CPU的資源,即CPU的執行權.
多個程序在搶這個資源,而其中一個程序如果有多個執行路徑,即多個執行緒,那麼就有更高的機率搶到CPU的執行權
建立一個執行緒
Java 提供了三種建立執行緒的方法:
- 通過實現 Runnable 介面;
- 通過繼承 Thread 類本身;
- 通過 Callable 和 Future 建立執行緒。
(二)例項1:在應用程式主程序中新開一個執行緒,此執行緒進行死迴圈,每1秒被啟用一次,啟用時即在輸出顯示當前時間。
任務步驟:
1.建立一個ThreadDate類繼承於父類Thread
2.在ThreadDate類類中定義run方法,具體任務的實現寫在run方法中(Thread.sleep(1000);//休眠時間為一秒,執行緒每隔一秒啟用一次);
3.開啟執行緒 t.start();
程式碼如下:
import java.util.Date;
import java.text.SimpleDateFormat;
class ThreadDate extends Thread//ThreadDate類繼承於父類Thread
{
public void run()//run方法,包含所需執行的任務
{
while(true)//死迴圈
{
try
{
Thread.sleep(1000);//執行緒每隔一秒啟用一次
SimpleDateFormat ft=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");//日期格式化
System.out.println("時間:"+ft.format(new Date()));//輸出當前時間
}
catch (InterruptedException e)
{
}
}
}
}
class ThDemo
{
public static void main(String[] args)
{
ThreadDate t = new ThreadDate();//建立一個ThreadDate類
t.start();//開啟執行緒
}
}
結果如下:
(三)例項2:應用程式公共類有一個double型類屬性(變數)x,初始值為0;在應用程式主程序中新開兩個執行緒,這兩個執行緒都進行死迴圈;第1個執行緒每隔300ms啟用一次,令類屬性x自加1.0並輸出顯示;第2個執行緒每隔400ms啟用一次,令類屬性x自加0.1並輸出顯示。
任務步驟:
1.建立兩個執行緒(通過Runnable介面來建立),公共類定義double型屬性x; 2.線上程1中建構函式讀取公共類中的x,然後定義run方法,執行緒2同樣的做法; 3.開啟兩個執行緒
程式碼如下:
class ThreadDemo1 implements Runnable//執行緒1
{
double x1;
public ThreadDemo1(double x)//利用建構函式讀取公共類中的x
{
this.x1 = x;
}
public void run()//run方法,包含所需執行的任務
{
while(true)//死迴圈
{
try
{
Thread.sleep(3000);//執行緒每隔三秒啟用一次
x1+=1;//x1=x1+1
System.out.println("x1:"+x1);//輸出x1
}
catch (InterruptedException e)
{
}
}
}
}
class ThreadDemo2 implements Runnable//執行緒2
{
double x2;
public ThreadDemo2(double x)//利用建構函式讀取公共類中的x
{
this.x2 = x;
}
public void run()//run方法,包含所需執行的任務
{
while(true)//死迴圈
{
try
{
Thread.sleep(4000);//執行緒每隔四秒啟用一次
x2+=0.1;//x2=x2+1
System.out.println("x2:"+x2);//輸出x2
}
catch (InterruptedException e)
{
}
}
}
}
class ThDemo1
{
public static void main(String[] args)
{
double x=0;//公共類double屬性的變數x,賦值0
ThreadDemo1 th1=new ThreadDemo1(x);//建立執行緒
ThreadDemo2 th2=new ThreadDemo2(x);
Thread t1 = new Thread(th1);//建立Thread類
Thread t2 = new Thread(th2);
t1.start();//開啟執行緒1
t2.start();//開啟執行緒2
}
}
結果如下: