JAVA基础-线程实现定时器

想要实现每隔一段时间,更改界面的参数变量,比如进度条,标签文字更改,都可以用以下方法实现。

用线程实现定时器,传入参数interval为时间间隔,保证程序每隔interval秒执行一次。
public class TaskThread extends Thread{
    public ArrayList <MainInfo> list=UI.list;
    public int interval;
    public TaskThread(int interval) {
        this.interval=interval;
    }

    @Override
    public void run() {
    try {
            Thread.sleep(interval*1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

在线程外套一层循环,保证每次获得对象后,所作的操作间隔interval时长。

        for (int i = 0; i < list.size(); i++) {    
            MainInfo mi=list.get(i);                
            System.out.println(mi.toString());
            interval=mi.Interval;

            label2.setText(mi.StartPoint);
            label4.setText(mi.Meridians);
            label6.setText(mi.EndPoint);
            label7.setText(mi.StartTime);
            Date date =new Date(System.currentTimeMillis());
            SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String s= sdf.format(date);
            label9.setText(s);
            label8.setText(mi.EndTime);            
            TaskThread tt=new TaskThread(interval);
            
            
            tt.start();
            JProgressBar bar = new JProgressBar(JProgressBar.HORIZONTAL,0,interval);
            bar.setBounds(100,150,200,20);
            //设置进度条的属性

            bar.setBorderPainted(true);//设置进度条边框
            panel.add(bar);    
            for (int j = 0; j <=interval; j++) {
                bar.setValue(j);//给进度条赋值
                try {
                    Thread.sleep(1000);//设置睡眠(使进度条每1000ms增加一次)
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
            }
            tt.join();

        }

其中,list列表中的mi有以下属性:

public class MainInfo {
    public String OrderIndex;
    public String Meridians;
    public String StartPoint;
    public String EndPoint;
    public int Interval;
    public String StartTime;
    public String EndTime;
    public MainInfo(String OrderIndex,String Meridians,String StartPoint,String EndPoint,int Interval,String StartTime,String EndTime){
        this.OrderIndex=OrderIndex;
        this.Meridians=Meridians;
        this.StartPoint=StartPoint;
        this.EndPoint=EndPoint;
        this.Interval=Interval;
        this.StartTime=StartTime;
        this.EndTime=EndTime;
    }
    @Override
    public String toString() {
        return "MainInfo [OrderIndex=" + OrderIndex + ", Meridians=" + Meridians + ", StartPoint=" + StartPoint
                + ", EndPoint=" + EndPoint + ", Interval=" + Interval + ", StartTime=" + StartTime + ", EndTime="
                + EndTime + "]";
    }
    
}

打印出来每条是这样

MainInfo [OrderIndex=1.1.1, Meridians=左手太阴肺经, StartPoint=中府, EndPoint=少商, Interval=39, StartTime=3:0:0, EndTime=3:0:38]

包括序号、经脉、起始穴位,终点穴位,持续时间,开始时间,结束时间

主要实现每隔指定时间,更新穴位,开始时间,结束时间,并根据持续时间,实现每秒更新进度条,进度条的总时间长度是持续时间。


当然也可以使用timer和timertask类来实现

1.指定多久之后执行此任务,但只会执行一次,以下实现3s后执行打印操作

public class TimerTest {

    Timer timer;  
  
    public TimerTest(int time){
    timer = new Timer();    
    timer.schedule(new timerTaskTest(),time*1000);//timer.schedule(执行的方法,延迟多久执行(ms))

    }

public static void main(String[] args) {

    System.out.println("timer begin...");    
    new TimerTest(3);

    }

class timerTaskTest extends TimerTask{

    @Override
    public void run() {

    System.out.println("time's up!!");

        }

    }

}

2.在指定的时间执行任务,以下程序实现在一个半小时后执行打印操作

public class TimerTest {

    Timer timer;
    
    public TimerTest(){
    
        Date time = getTime();
        
        System.out.println("指定时间time="+time);
        
        timer = new Timer();
        
        timer.schedule(new TimerTaskTest(),time);//timer.schedule(执行的方法,要执行的时间)

    }

public Date getTime(){//设置执行时间

    Calendar calendar = Calendar.getInstance();    
    calendar.set(Calendar.HOUR,1);  
    calendar.set(Calendar.MINUTE,30);   
    calendar.set(Calendar.SECOND,00);
    
    Date time = calendar.getTime();
    
    return time;

    }

public static void main(String[] args) {

    new TimerTest();

    }

class TimerTaskTest1 extends TimerTask{

    public void run() {

        System.out.println("指定时间执行线程任务...");

        }

    }

}

3.在延迟指定时间后以指定的间隔时间循环执行定时任务,以下程序实现了每隔2s执行1s程序

public class TimerTest2 {

    Timer timer;
    
    public TimerTest2(){
    
        timer = new Timer();
        
        timer.schedule(new TimerTaskTest2(),1000,2000);//tiemr.schedule(执行的方法,延迟时间,多久执行一次)

    }

class TimerTaskTest2 extends TimerTask{

    @Override
    
    public void run() {
    
    System.out.println("本次任务执行时间"+new Date());

    }

}

public static void main(String[] args) {

    new TimerTest2();

    }

}

以上是定时实现程序的全部内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值