【java多线程与并发库】--- 定时器的应用

系统 1556 0

定时器的应用

1、 定时器主要涉及到两个类( java.util 包中)

    
      @-》
    
    
      public class 
      
        Timer
      
       extends 
    
    
      
        Object
      
    
  

(一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。 )

    
      @-->
      
        public abstract class 
        
          TimerTask
        
         extends 
      
    
    
      
        Object
      
    
    
       implements 
    
    
      
        Runnable
      
    
  
    
      (由 Timer 安排为一次执行或重复执行的任务。)
    
  
    
    
  
    
    
  
    
      2、
      
        
          Timer类的构造方法:
        
      
    
  
    
    
  

构造方法摘要

Timer ()
创建一个新计时器。

Timer (booleanisDaemon)
创建一个新计时器,可以指定其相关的线程作为守护程序运行。

Timer ( String name)
创建一个新计时器,其相关的线程具有指定的名称。

Timer ( String name, booleanisDaemon)
创建一个新计时器,其相关的线程具有指定的名称,并且可以指定作为守护程序运行。

    
    
  

与每个 Timer 对象相对应的是单个后台线程,用于顺序地执行所有计时器任务。

计时器任务应该迅速完成。如果完成某个计时器任务的时间太长,那么它会“独占”计时器的任务执行线程。因此,这就可能延迟后续任务的执行,而这些任务就可能“堆在一起”,并且在上述不友好的任务最终完成时才能够被快速连续地执行。

Timer 对象最后的引用完成后, 并且 所有未处理的任务都已执行完成后,计时器的任务执行线程会正常终止(并且成为垃圾回收的对象)。但是这可能要很长时间后才发生。

默认情况下,任务执行线程并不作为 守护线程 来运行,所以它能够阻止应用程序终止。如果调用者想要快速终止计时器的任务执行线程,那么调用者应该调用计时器的 cancel 方法。

如果意外终止了计时器的任务执行线程,例如调用了它的 stop 方法,那么所有以后对该计时器安排任务的尝试都将导致 IllegalStateException ,就好像调用了计时器的 cancel 方法一样。

此类是线程安全的:多个线程可以共享单个 Timer 对象而无需进行外部同步。

此类 提供实时保证:它使用 Object.wait(long) 方法来安排任务。

实现注意事项:此类可扩展到大量同时安排的任务(存在数千个都没有问题)。在内部,它使用二进制堆来表示其任务队列,所以安排任务的开销是 O(log n),其中 n 是同时安排的任务数。

实现注意事项:所有构造方法都启动计时器线程。

方法摘要

void

cancel ()
终止此计时器,丢弃所有当前已安排的任务。

int

purge ()
从此计时器的任务队列中移除所有已取消的任务。

void

schedule ( TimerTask task, Date time)
安排在指定的时间执行指定的任务。

void

schedule ( TimerTask task, Date firstTime, longperiod)
安排指定的任务在指定的时间开始进行重复的 固定延迟执行

void

schedule ( TimerTask task, longdelay)
安排在指定延迟后执行指定的任务。

void

schedule ( TimerTask task, longdelay, longperiod)
安排指定的任务从指定的延迟后开始进行重复的 固定延迟执行

void

scheduleAtFixedRate ( TimerTask task, Date firstTime, longperiod)
安排指定的任务在指定的时间开始进行重复的 固定速率执行

void

scheduleAtFixedRate ( TimerTask task, longdelay, longperiod)
安排指定的任务在指定的延迟后开始进行重复的 固定速率执行

    
    
  
    
    
  
    
    
  
    
    
  
    
      3、TimerTask类的构造方法:
    
  
    
    
  

构造方法摘要

protected

TimerTask ()
创建一个新的计时器任务。

    
    
  
    
    
  
    
    
  

方法摘要

boolean

cancel ()
取消此计时器任务。

abstract void

run ()
此计时器任务要执行的操作。

long

scheduledExecutionTime ()
返回此任务最近 实际 执行的 已安排 执行时间。

    
    
  
    
    
  
    
    
  
    
    
  
    
    
  
    
    
  
    
      实例1:
    
  
    import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;


public class TimerTest {

	/**
	 * @param args
	 */

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//每隔10s打印"hello,honey!";
		new Timer().schedule(new TimerTask(){

			@Override
			public void run() {
				// TODO Auto-generated method stub
				System.out.println("hello,honey!");
			}
			
		}, 10000);
		while(true){
			System.out.println(new Date().getSeconds());//打印当前秒数
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

  

实例2:

    import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
 
 
public class TimerTest {
 
        /**
         * @param args
         */
 
        public static void main(String[] args) {
               // TODO Auto-generated method stub
               //每隔10s打印"hello,honey!";
               new Timer().schedule(new TimerTask(){
 
                       @Override
                       public void run() {
                               // TODO Auto-generated method stub
                               System.out.println("hello,honey!");
                       }
                       
               }, 10000,3000);//10s后打印,以后每隔3s打印一次
               /*while(true){
                       System.out.println(new Date().getSeconds());//打印当前秒数
                       try {
                               Thread.sleep(1000);
                       } catch (InterruptedException e) {
                               // TODO Auto-generated catch block
                               e.printStackTrace();
                       }
               }*/
        }
 
}

  


运行结果:

【java多线程与并发库】--- 定时器的应用

  

【java多线程与并发库】--- 定时器的应用


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论