Java-01-源码篇-JUC并发编程-常用类
JUC 并发模块是java在多线程提供的一种更加合理的设计并发框架。
J.U.C 是java.util.concurrent 包名称首字母的缩写。J.U.C是为了解决Java在多线程并发环境的性能以及稳定性问题。
J.U.C 在锁的方面也提供一套新机制的锁,除此外,J.U.C还提供了指定数据类型的同步机制,避免了在进行数据操作时通过方法实现同步的处理了
首先,了解一下JUC并发包常用的类。
一,ThreadFactory
一个面向对象的编程语言,就需要进行不断的解耦和设计的考虑,毕竟直接通过关键字 new 进行线程对象的构建,所以,为了更加符合面向对象的设计理念,J.U.C里面提供线程对象的获取机制,提供一个工厂类的标准接口。
package java.util.concurrent;
/**
* @since 1.5
* @author Doug Lea
*/
public interface ThreadFactory {
Thread newThread(Runnable r);
}
看案例
public static void main(String[] args) {
CustomThreadFactory customThreadFactory = new CustomThreadFactory("worker", false);
ExecutorService executorService = Executors.newFixedThreadPool(3, customThreadFactory);
for (int i = 0; i < 5; i++) {
executorService.execute(() -> {
System.out.println(Thread.currentThread().getName() + " is running");
});
}
executorService.shutdown();
}
输出结果
worker-thread-1 is running
worker-thread-1 is running
worker-thread-1 is running
worker-thread-2 is running
worker-thread-3 is running
二,TimeUint 时间单元
在实际开发中,不仅仅只要毫秒的线程配置的要求,还可能会用到时,分,秒等等。所以在java里面进一步简化这种时间的计算管理,提供了一个专属的TimeUnit工具类,该工具类是一个枚举类
该工具类提供了时间常用的时间常量:
package java.util.concurrent;
public enum TimeUnit {
NANOSECONDS(TimeUnit.NANO_SCALE), /** 纳秒 */
MICROSECONDS(TimeUnit.MICRO_SCALE), /** 微秒 */
MILLISECONDS(TimeUnit.MILLI_SCALE), /** 毫秒 */
SECONDS(TimeUnit.SECOND_SCALE), /** 秒 */
MINUTES(TimeUnit.MINUTE_SCALE), /** 分钟 */
HOURS(TimeUnit.HOUR_SCALE), /** 小时 */
DAYS(TimeUnit.DAY_SCALE); /** 天 */
/** 忽略其他代码 */
}
还提供常用的时间转换方法:
public class TimeUnitExample {
public static void main(String[] args) {
long hours = 2; // 2 小时
long milliseconds = TimeUnit.MILLISECONDS.convert(hours, TimeUnit.HOURS);
System.out.println(hours + " 小时 = " + milliseconds + " 毫秒");
}
}
输出结果:
2 小时 = 7200000 毫秒
三,Delayed
3.1 主要用途
Delayed 是 Java 并发包 (java.util.concurrent) 中的一个接口,主要用于表示带有延迟时间的对象,通常与 延迟队列 (DelayQueue) 一起使用。
public interface Delayed extends Comparable<Delayed> {
/**
* 返回当前对象的剩余延迟时间,单位由 unit 指定。
* 只有当 getDelay() 返回值小于等于 0 时,该对象才可以从队列中取出。
*/
long getDelay(TimeUnit unit);
}
实现 Comparable<Delayed>
接口:
Delayed
继承了Comparable<Delayed>
,因此Delayed
对象需要实现compareTo()
方法,用于在DelayQueue
中按照延迟时间进行排序。
Delayed
主要配合 DelayQueue
使用,可用于:
- 任务调度(定时任务执行)
- 缓存超时处理(延迟移除缓存)
- 定时重试机制(如网络请求失败后的重试)
3.2 Demo案例
class DelayedTask implements Delayed {
private final String name; // 任务名称
private final long startTime; // 任务执行时间(毫秒)
public DelayedTask(String name, long delayTime) {
this.name = name;
this.startTime = System.currentTimeMillis() + delayTime;
}
@Override
public long getDelay(TimeUnit unit) {
long remainingTime = startTime - System.currentTimeMillis();
return unit.convert(remainingTime, TimeUnit.MILLISECONDS);
}
@Override
public int compareTo(Delayed o) {
return Long.compare(this.getDelay(TimeUnit.MILLISECONDS), o.getDelay(TimeUnit.MILLISECONDS));
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Task{" + "name='" + name + '\'' + ", startTime=" + startTime + '}';
}
}
public class DelayQueueExample {
public static void main(String[] args) throws InterruptedException {
DelayQueue<DelayedTask> delayQueue = new DelayQueue<>();
// 添加任务(分别延迟 3 秒和 5 秒)
delayQueue.put(new DelayedTask("Task1", 3000));
delayQueue.put(new DelayedTask("Task2", 5000));
System.out.println("任务添加完成,稍后执行");
// 逐个取出任务(只有到达执行时间的任务才能取出)
while (!delayQueue.isEmpty()) {
DelayedTask task = delayQueue.take(); // take() 会阻塞,直到可取出
System.out.println("任务执行: " + task.getName() + " 执行时间: " + System.currentTimeMillis());
}
System.out.println("全部执行完成");
}
}
输出结果
任务添加完成,稍后执行
任务执行: Task1 执行时间: 1743061599626
任务执行: Task2 执行时间: 1743061601630
全部执行完成
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/100658.html
如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!