Java定時器

第一種方法:

 創建一個thread,然後讓它在while循環裏一直運行着,通過sleep方法來達到定時任務的效果,代碼如下:

public class Task1 {
	public static void main(String[] args) {
		// run in a second
		// 每一秒鐘執行一次
		final long timeInterval = 1000;
		Runnable runnable = new Runnable() {
			public void run() {
				while (true) {
					// ------- code for task to run
					// ------- 要運行的任務代碼
					System.out.println("Hello, stranger");
					// ------- ends here
					try {
						// sleep():同步延遲數據,並且會阻塞線程
						Thread.sleep(timeInterval);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		};
		//創建定時器
		Thread thread = new Thread(runnable);
		//開始執行
		thread.start();
	}
}

第二種方法:

 啓動和去取消任務時可以控制,可以指定你想要的delay(開始執行的等待時間)時間,在實現時,Timer類可以調度任務,TimerTask則是通過在run()方法裏實現具體任務。 Timer實例可以調度多任務,它是線程安全的。 當Timer的構造器被調用時,它創建了一個線程,這個線程可以用來調度任務。代碼如下:
 

// 調用的工具
import java.util.Timer;
import java.util.TimerTask;
 
public class Task2 {
	public static void main(String[] args) {
		/**
		 * Timer:是一個定時器工具,用來執行指定任務
		 * TimerTask:是一個抽象類,他的子類可以代表一個被Timer計劃的任務
		 */
		TimerTask task = new TimerTask() {
			@Override
			public void run() {
				// task to run goes here
				// 執行的輸出的內容
				System.out.println("Hello, stranger");
			}
		};
		Timer timer = new Timer();
		// 定義開始等待時間  --- 等待 5 秒
		// 1000ms = 1s
		long delay = 5000;
		// 定義每次執行的間隔時間
		long intevalPeriod = 5 * 1000;
		// schedules the task to be run in an interval
		// 安排任務在一段時間內運行
		timer.scheduleAtFixedRate(task, delay, intevalPeriod);
	} // end of main
}

 

第三種方法(最好):

 相比於上兩個方法,它有以下好處:
        1.相比於Timer的單線程,它是通過線程池的方式來執行任務的 
        2.可以很靈活的去設定第一次執行任務delay時間
        3.提供了良好的約定,以便設定執行的時間間隔

package com.linkpal.timer;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import com.linkpal.dao.jdbcUtil;

public class TBTimer002 {

	

	public static void timer1() {
		
			
			/**Runnable:實現了Runnable接口,jdk就知道這個類是一個線程  */
			Runnable runnable=new Runnable() {
				
				public void run() {
					System.err.println("定時器已啓動。。。。。。");
//					System.out.println("定時器,設定爲晚上12:00");
//					System.err.println("-------延遲5000毫秒,每1000毫秒執行一次--------");
//					Connection connection = null;
//					CallableStatement prepareCall = null;
//					ResultSet rs = null;
//					
//					connection= jdbcUtil.getConnection();
//					try {
//						PreparedStatement preparedStatement=connection.prepareStatement("SELECT * FROM [tb].[dbo].[user]");
//						rs=preparedStatement.executeQuery();
//					//獲取數據,打印在控制檯
//						while (rs.next()) {
//							int id=rs.getInt("id");
//							String username=rs.getString("username");
//							String password=rs.getString("password");
//							String hh=rs.getString("hh");
//							System.out.println("id: " + id + " 姓名: " + username + " 密碼: " + password+" hh"+hh);
//							
//						}
//					
//					} catch (SQLException e) {
//						// TODO Auto-generated catch block
//						e.printStackTrace();
//					}finally {
//						jdbcUtil.release(connection, prepareCall, rs);
//					}

				}
			};
			// ScheduledExecutorService:是從Java SE5的java.util.concurrent裏,
			// 做爲併發工具類被引進的,這是最理想的定時任務實現方式。
			ScheduledExecutorService sService=Executors.newSingleThreadScheduledExecutor();
			// 第二個參數爲首次執行的延時時間,第三個參數爲定時執行的間隔時間
			// 10:秒   5:秒
			// 第一次執行的時間爲10秒,然後每隔五秒執行一次
			//TimeUnit.SECONDS:設置顆粒度,秒
			
			sService.scheduleAtFixedRate(runnable,1000*10,5*1000,TimeUnit.MILLISECONDS);
			
			
		
	}
	
	
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章