定時任務實現 java

簡單介紹一下背景,有N個人,要求每秒出現一個人,間隔也爲一秒,不能重複,總耗時不能超過N+1秒


/*******************************************************************************
 * $Header$
 * $Revision$
 * $Date$
 *
 *==============================================================================
 *
 * Copyright (c) 2001-2006 Primeton Technologies, Ltd.
 * All rights reserved.
 * 
 * Created on 2007-10-18
 ******************************************************************************
*/


/**
 * TODO 此處填寫 class 信息
 *
 * 
@author wangwh (mailto:[email protected])
 
*/

/*
 * 修改歷史
 * $Log$ 
 
*/

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;
/*
 * 創建一個任務類
 
*/

class MyTimeTask extends TimerTask {
    
public static long oldtime = System.nanoTime();//這裏的時間都是用於測試運行週期的,以鈉秒爲單位.

    
private long oldtime2 = 0;//

    
private static Set set = new HashSet();//用set 來存取Object,也可用List;

    
public static int count = 0;//總人數;
    /*
     * 構造器
     
*/

    MyTimeTask(
int count) {
        
this.count = count;
    }

    
/*
     * 入棧方法
     
*/

    
public void push(Object o) {
        set.add(o);
    }

    
/*
     * 出棧方法
     
*/

    
public Object pop() {
        
int t = (int) Math.random() % count;//取隨機數
        Object o = (set.toArray())[t];//取隨機對象,這裏可以改進一下,太醜了
        set.remove(o);//取完後刪除
        count--;//將總人數減一
        return o;
    }

    
/*
     *run方法, 
     
*/

    
public void run() {
        
long t = System.nanoTime() - oldtime;
        
if(count==0)return ;//當最後一個人出棧的時候,不再執行
        System.out.println("出棧的是  " + pop()+ "號   耗時 "+ t+" 鈉秒");

        oldtime 
= System.nanoTime();
    }

}


public class TimerTest {

    
public static void main(String[] args) {
        
long oldtime2 = System.currentTimeMillis();
        MyTimeTask myTask 
= new MyTimeTask(200);
        Timer myTimer 
= new Timer();
        
//將人放入棧中
        for (int i = 0; i < 200; i++{
            myTask.push(i);
        }

        
        myTimer.scheduleAtFixedRate(myTask, 
01000);//設置myTask的運行週期;並調用其RUN()方法
        
        
try {
            Thread.sleep(
200000);//主程序sleep  16秒,如果不夠,可以再加
        }
 catch (InterruptedException exc) {
            exc.printStackTrace();
        }

        myTimer.cancel();
//結束Timer
        long t = System.currentTimeMillis() - oldtime2;
        System.out.println(
"This process spend .  " + t+ "   second");
    }

}

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