1. 程式人生 > >java定時器類Timer和多執行緒介紹及例項

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建構函式:

img

Timer的方法:

img

(二)例項:使用定時器程式設計,在實時顯示當前時間,每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

    }
}

結果如下: 在這裡插入圖片描述