Java TimeUnit使用

本文深入解析了Java中TimeUnit类的使用方法,包括不同时间单位之间的转换及如何利用TimeUnit进行延时操作,提供了代码示例,是理解Java并发包中时间处理机制的实用指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java TimeUnit使用

96 有苦向瓜诉说 关注

2017.11.19 16:46 字数 49 阅读 1117评论 0喜欢 0

TimeUnit

TimeUnit是java.util.concurrent包下面的一个类,表示给定单元粒度的时间段。

常用的颗粒度

TimeUnit.DAYS          //天
TimeUnit.HOURS         //小时
TimeUnit.MINUTES       //分钟
TimeUnit.SECONDS       //秒
TimeUnit.MILLISECONDS  //毫秒

1.颗粒度转换

public long toMillis(long d)    //转化成毫秒
public long toSeconds(long d)  //转化成秒
public long toMinutes(long d)  //转化成分钟
public long toHours(long d)    //转化成小时
public long toDays(long d)     //转化天
import java.util.concurrent.TimeUnit;

public class TimeUnitTest {

    public static void main(String[] args) {
        //convert 1 day to 24 hour
        System.out.println(TimeUnit.DAYS.toHours(1));
        //convert 1 hour to 60*60 second.
        System.out.println(TimeUnit.HOURS.toSeconds(1));
        //convert 3 days to 72 hours.
        System.out.println(TimeUnit.HOURS.convert(3, TimeUnit.DAYS));
    }

}

2.延时,可替代Thread.sleep()。

import java.util.concurrent.TimeUnit;

public class ThreadSleep {

    public static void main(String[] args) {
        Thread t = new Thread(new Runnable() {
            private int count = 0;

            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    try {
                        // Thread.sleep(500); //sleep 单位是毫秒
                        TimeUnit.SECONDS.sleep(1); // 单位可以自定义,more convinent
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    count++;
                    System.out.println(count);
                }
            }
        });
        t.start();
    }
}
### Java线程池的使用方法 在Java中,`ExecutorService`接口提供了管理一组线程的方法,并简化了异步任务执行的过程。通过该接口可以方便地管理和控制多个工作线程。 #### 创建固定大小的线程池 当应用程序需要处理大量短期活动对象时,可采用此方式来重用预先创建好的工作线程,从而减少由于频繁创建销毁所带来的开销[^1]。 ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class FixedThreadPoolExample { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(5); Runnable task = () -> System.out.println(Thread.currentThread().getName() + ": Executing Task"); for (int i = 0; i < 10; ++i){ executor.submit(task); } executor.shutdown(); } } ``` #### 单一线程池 如果希望顺序执行各个提交的任务,则可以选择单线程模式下的线程池实现类[^2]。 ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class SingleThreadExample { public static void main(String[] args) throws InterruptedException{ ExecutorService executor = Executors.newSingleThreadExecutor(); Runnable worker = new WorkerThread("Task"); for(int i=0;i<5;i++){ Thread.sleep(10); //模拟间隔时间 executor.execute(worker); } executor.shutdown(); } } class WorkerThread implements Runnable { private String command; public WorkerThread(String s){ this.command=s; } @Override public void run(){ System.out.println(Thread.currentThread().getName()+" Start. Command = "+command); processCommand(); System.out.println(Thread.currentThread().getName()+" End."); } private void processCommand(){ try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } ``` #### 缓存型线程池 对于那些负载较轻但数量众多的小型任务来说非常适合,它会根据需求动态调整内部的工作线程数目,在必要时候甚至能无限增长. ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CachedThreadPoolExample { public static void main(String[] args) { ExecutorService executor = Executors.newCachedThreadPool(); for (int i = 0; i < 10; ++i) { final int taskId = i; executor.submit(() -> System.out.println("Executing Task " + taskId)); } executor.shutdown(); } } ``` #### 定时调度线程池 适用于定时或周期性的任务安排场景下,能够按照指定的时间间隔重复执行给定的操作. ```java import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class ScheduledThreadPoolExample { public static void main(String[] args) throws InterruptedException { ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(4); Runnable periodicTask = () -> System.out.println("Periodic Task Execution Time: " + System.currentTimeMillis()); // 延迟两秒后每三秒钟打印一次当前毫秒数 scheduler.scheduleAtFixedRate(periodicTask, 2, 3, TimeUnit.SECONDS); // 让主线程等待一段时间以便观察效果后再关闭资源 Thread.sleep(20 * 1000L); scheduler.shutdown(); } } ``` #### 关闭线程池的最佳实践 为了确保程序结束前所有已提交的任务都能被执行完毕而不被中途打断,应当调用`shutdown()`方法而非直接终止整个进程。另外还可以考虑设置合理的超时期限并捕获可能发生的异常情况以提高系统的健壮性和稳定性.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值