Java线程Thread类:从基础使用到高级特性
一、Thread类核心构造方法剖析
Java线程的创建主要通过三种典型构造方式实现:
- 默认构造方法
Thread thread = new Thread();
此时线程名称为"Thread-N"格式(N为自增数字),但未绑定任何任务逻辑,需要后续调用start()
方法前通过setRunnable()
注入代码
- Runnable接口构造
Runnable task = () -> System.out.println("执行线程任务");
Thread worker = new Thread(task, "Worker-1");
这是最推荐的构造方式,通过实现Runnable接口实现任务与线程控制的解耦
- 继承Thread类
class CustomThread extends Thread {
public void run() {
// 自定义线程逻辑
}
}
这种传统方式已逐渐被组合方式取代,因为Java不支持多重继承
二、线程生命周期关键方法
2.1 状态转换方法
// 新建状态 → 就绪状态
thread.start();
// 超时等待示例
try {
Thread.sleep(2000); // TIMED_WAITING状态
thread.join(500); // 调用者进入WAITING状态
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
2.2 中断控制机制
// 正确的中断处理模式
class InterruptibleTask implements Runnable {
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
// 模拟工作
TimeUnit.MILLISECONDS.sleep(100);
} catch (InterruptedException e) {
// 恢复中断状态
Thread.currentThread().interrupt();
System.out.println("线程被中断,执行清理操作");
break;
}
}
}
}
三、线程属性深度解析
3.1 优先级管理
// 设置优先级范围验证
thread.setPriority(Math.max(Thread.MIN_PRIORITY,
Math.min(priority, Thread.MAX_PRIORITY)));
3.2 守护线程特征
Thread daemon = new Thread(() -> {
while (true) {
System.out.println("后台服务运行中...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
break;
}
}
});
daemon.setDaemon(true);
daemon.start();
四、废弃方法替代方案
// 替代stop()的安全终止方案
class SafeStoppableTask implements Runnable {
private volatile boolean stopped = false;
void stop() {
stopped = true;
}
public void run() {
while (!stopped && !Thread.currentThread().isInterrupted()) {
// 执行任务逻辑
}
System.out.println("线程安全终止");
}
}
五、线程上下文实践
5.1 线程局部变量
private static final ThreadLocal<SimpleDateFormat> dateFormat =
ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));
public String formatDate(Date date) {
return dateFormat.get().format(date);
}
5.2 异常处理策略
Thread.setDefaultUncaughtExceptionHandler((t, e) -> {
System.err.println("线程" + t.getName() + "抛出异常: " + e);
// 记录日志或执行恢复操作
});
六、JavaEE环境线程规范
// 符合JEE规范的线程使用示例
@Resource
private ManagedExecutorService executor;
public void executeTask() {
executor.submit(() -> {
// 容器管理的线程任务
// 自动处理事务上下文传播
});
}
七、性能优化技巧
- 线程池参数调优公式
// 根据任务类型确定线程数量
int cpuCores = Runtime.getRuntime().availableProcessors();
int ioBoundPoolSize = cpuCores * 2;
int cpuBoundPoolSize = cpuCores + 1;
- 上下文切换优化
// 减少锁竞争示例
ConcurrentHashMap<String, AtomicInteger> counterMap = new ConcurrentHashMap<>();
public void increment(String key) {
counterMap.computeIfAbsent(key, k -> new AtomicInteger())
.incrementAndGet();
}
八、诊断工具实践
8.1 线程Dump分析
jstack <pid> > thread_dump.txt
# 分析死锁特征:
"Thread-1" prio=5 tid=0x00007fe008568000
java.lang.Thread.State: BLOCKED
at com.example.DeadlockDemo$ResourceA.methodA(DeadlockDemo.java:15)
- waiting to lock <0x000000076bf62200>
- locked <0x000000076bf62258>
"Thread-2" prio=5 tid=0x00007fe008569800
java.lang.Thread.State: BLOCKED
at com.example.DeadlockDemo$ResourceB.methodB(DeadlockDemo.java:30)
- waiting to lock <0x000000076bf62258>
- locked <0x000000076bf62200>
8.2 VisualVM监控
- 线程状态分布饼图
- CPU占用热点方法
- 锁竞争统计
九、现代并发模式演进
// CompletableFuture组合示例
CompletableFuture.supplyAsync(() -> fetchDataFromDB())
.thenApplyAsync(data -> processData(data), executorService)
.exceptionally(ex -> handleError(ex))
.thenAcceptAsync(result -> sendResult(result));
十、典型问题解决方案
- 线程饥饿对策
// 使用公平锁解决
ReentrantLock fairLock = new ReentrantLock(true);
- 伪共享预防
// 缓存行填充示例
@jdk.internal.vm.annotation.Contended
class Counter {
volatile long value1;
// 自动填充缓存行
volatile long value2;
}
正文到此结束
相关文章
热门推荐
评论插件初始化中...