线程 —— 定时器介绍

TimerTask 是一个抽象类,实现 TimerTask 的 run 方法。

示例 1:

/**
 * Created by liwei on 16/7/19.
 */
/*
 * 定时器:可以让我们在指定的时间做某件事情,还可以重复的做某件事情。
 * 依赖Timer和TimerTask这两个类:
 * Timer:定时
 *      public Timer()
 *      public void schedule(TimerTask task,long delay)
 *      public void schedule(TimerTask task,long delay,long period)
 *      public void cancel()
 * TimerTask:任务
 */
public class TimeDemo {

    public static void main(String[] args) {
        // 创建定时器对象
        Timer timer = new Timer();

        // 3 秒以后执行任务
        timer.schedule(new MyTask(timer),3*1000);
    }

}

// 做一个任务
class MyTask extends TimerTask{
    // 为了控制定时器结束,将 Timer 作为成员变量
    private Timer timer;

    public MyTask(){}

    public MyTask(Timer timer){
        this.timer = timer;
    }

    @Override
    public void run() {
        System.out.println("beng,爆炸了");
        // 结束任务
        timer.cancel();
    }
}

示例2:

public class TimeDemo2 {
    public static void main(String[] args) {
        Timer timer =new Timer();
        // 5 秒以后执行任务,每隔 2 秒(周期)再执行一次
        timer.schedule(new MyTask2(),5*1000,2*1000);
    }
}

// 做一个任务
class MyTask2 extends TimerTask{

    @Override
    public void run() {
        System.out.println("任务正在执行 --- ");
    }
}

示例3:
递归地删除目录

/**
 * Created by liwei on 16/7/19.
 *
 * 递归删除目录:在指定的时间内删除我们指定的目录
 */
class DeleteFolder extends TimerTask{

    @Override
    public void run() {
        File srcFolder = new File("demo");
        deleteFolder(srcFolder);
    }
    // 递归删除目录
    private void deleteFolder(File srcFolder) {
        File[] fileList = srcFolder.listFiles();
        if(fileList!=null){
            for(File file:fileList){
                if(file.isDirectory()){
                    deleteFolder(file);
                }else {
                    Boolean ifDelete = file.delete();
                    String fileName = file.getName();
                    System.out.println("文件 " + fileName + "是否删除成功:" + ifDelete);
                }
            }
            System.out.println(srcFolder.getName() + "删除根文件夹是否成功:" + srcFolder.delete());
        }
    }
}

public class TimerTest {

    public static void main(String[] args) throws ParseException{
        Timer timer = new Timer();
        String s = "2016-07-19 00:00:00";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = sdf.parse(s);
        // 在指定的时间递归地删除一个文件夹
        timer.schedule(new DeleteFolder(),date);
    }
}
### C# 上位机多线程定时器读取数据最佳实践 #### 多线程方式的优点 在C#上位机程序中,当涉及到实时读取及显示功能时,多线程是一种常用的方法。这种方式能够有效地处理长时间运行的任务而不阻塞主线程,确保用户界面保持响应状态[^1]。 对于需要频繁访问外部设备或网络服务的应用场景来说,使用独立的工作线程可以提高系统的稳定性和效率。如果遇到连接失败等问题,可以通过增加重试机制来增强可靠性。此外,在面对复杂业务逻辑的情况下,合理设计多个子任务并发执行也有助于提升整体性能。 ```csharp private Thread _readThread; public void StartReading() { _readThread = new Thread(() => { while (true) { try { var data = ReadDataFromSource(); Invoke(new Action(() => UpdateUIData(data))); } catch (Exception ex) { HandleError(ex); ReconnectIfNecessary(); } Thread.Sleep(intervalMilliseconds); // 控制循环频率 } }); _readThread.Start(); } ``` #### 定时器方式的特点 另一方面,利用`System.Timers.Timer`或其他类型的计时器组件也可以完成周期性的数据采集工作。相比起手动管理线程生命周期而言,这种方法更加简洁直观,并且减少了潜在的风险因素,比如内存泄漏或者资源竞争等现象的发生概率[^2]。 特别是针对那些仅需定期查询固定间隔时间内的最新记录的情形,设定好触发条件之后几乎不需要额外维护成本就能满足需求。不过需要注意的是,由于每次回调都是在一个新的线程池成员里发生的,因此同样要考虑到跨线程调用UI控件的安全性问题。 ```csharp using System.Timers; Timer timer = null; public void SetupPeriodicReads(int intervalMs) { timer = new Timer(intervalMs); timer.Elapsed += OnTimedEvent; timer.AutoReset = true; timer.Enabled = true; } private void OnTimedEvent(Object source, ElapsedEventArgs e) { var data = ReadDataFromSource(); this.Invoke((MethodInvoker)delegate { UpdateUIData(data); }); } ``` #### 如何选择合适的技术方案? 为了决定究竟应该选用哪种策略作为最终解决方案,则取决于具体应用场景的要求: - 对于简单重复的任务或是希望减少开发难度的情况之下,基于现有框架提供的工具类(如各种形式的计时器)往往更为便捷高效。 无论采取何种手段,都需要充分考虑如何妥善处理可能出现的各种异常状况,保障整个通信过程中的稳定性与安全性。另外,鉴于两者之间存在一定的相似之处——即都会涉及不同步的操作环境之间的交互,所以务必遵循良好的编程习惯,例如始终记得释放不再使用的资源、避免不必要的锁争用等等[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值