简介JUC
JUC是java并发编程中常用到的框架,其于JDK5中被提出,实现在java.util.concurrent
包下,所以被人们广为称之JUC。它的核心理念是CAS、AQS,利用这两个理念,可以解决开发过程中的性能问题以及稳定性的问题,例如:
- 想使用线程就要使用Runnable,Callable接口;
- 想数据同步处理,要使用synchronized,但性能很差;
- 想实现变量的数据更新,要是用volatile;
- 想实现等待与唤醒,使用Object类中提供的wait()、notify();
但有了上面这些实现方式,就有了死锁的概念出现了。所以开发者想要轻松实现开发,一套让人轻松且可靠的框架少不了,这就是为什么要学习JUC的原因了。
JUC包的组成
可以发现,JUC的组成主要是atomic的原子操作类、locks的锁实现类以及根据这两个类实现的工具。
TimeUnit使用
虽然在 Thread 的开发之中可以使用毫秒和纳秒进行线程单位的配置,但是从实际的开发来说有可能会使用到时、分、秒等概念,所以在Java 里面为了进一步简化这种时间的计算管理,提供了一个专属的 TimeUnit 工具类,该类属于一个枚举类:
public enum TimeUnit {}
在整个的 TimeUnit 里面已经定义了大量的常用的时间单元:天(DAYS)、小时(HOURS)、分钟(MINUTES)、秒(SECONDS)、毫秒 (MILLISECONDS)、纳秒 (NANOSECONDS)、微秒(MICROSECONDS),除了这些时间单元之外还提供有了一系列的处理方法,例如:时间转换方法
public class Main {
public static void main(String[] args) {
long hour = 1;
long second = TimeUnit.SECONDS.convert(hour, TimeUnit.HOURS);
System.out.println(second);
}
}
虽然 TimeUnit 类很好用,但是从JDK1.8 之后提供了一个java.time.Duration 的操作类(问隔),这个类在实际的开发之中经常会被使用到,例如:在后续学习到 Spring 开发框架的时候,那么一般都要进行任务间隔的配置。
Duration duration = Duration.ofHours(2).plusHours(1);
System.out.println(duration);
long minutes = TimeUnit.MINUTES.convert(duration);
System.out.println(minutes);
PT3H
180
范例:使用TimeUnit计算180天后的日期
long current = System.currentTimeMillis();
long after = current + TimeUnit.MILLISECONDS.convert(180, TimeUnit.DAYS);
String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(after));
System.out.println(date);
2022-06-14 23:27:11
在末来进行多线程的开发之中只要是牵扯到时间单位的操作问题的话,要统一使用 TimeUnit 类进行定义处理,这是在JUC里面见到最多的参数的形式。
范例:实现每n秒执行某个操作
for (int i = 0; i < 10; i ++) {
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(() -> {
System.out.println("[ "+ Thread.currentThread().getName() +" ] hello alexander!");
}).start();
}
[ Thread-0 ] hello alexander!
[ Thread-1 ] hello alexander!
[ Thread-2 ] hello alexander!
···