新建状态(New):new Thread 此时线程对象已经被创建,但还没有开始运行。
就绪状态(Runnable):调用start()
方法后,线程进入就绪状态。此时线程已经准备好运行,但可能还没有被分配到CPU时间片。
运行状态(Running):当线程获得CPU时间片并开始执行时,线程进入运行状态,执行run()
方法
阻塞状态(Blocked):当线程因为某些原因无法继续执行时,线程进入阻塞状态。阻塞状态可以分为多种类型,如等待I/O、等待锁、等待信号等。
等待状态(Waiting):当线程需要等待某些条件满足时,线程进入等待状态。等待状态可以通过wait()
方法、join()
方法等实现。
计时等待状态(Timed Waiting):当线程需要等待一定时间或者等待某些条件满足时,线程进入计时等待状态。计时等待状态可以通过sleep()方法、wait(timeout)方法等实现。
终止状态(Terminated):当线程完成了任务或者因为异常等原因退出时,线程进入终止状态。此时线程的生命周期结束。
生命周期详细推荐阅读:https://www.cnblogs.com/huigui-mint/p/17468736.html
class MyThread extends Thread {
@Override
public void run() {
System.out.println("这是通过继承Thread类创建的线程在执行任务");
}
}
public class Main {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
}
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("这是通过实现Runnable接口创建的线程在执行任务");
}
}
public class Main {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
}
}
class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
return "这是通过实现Callable接口创建的线程执行结果";
}
}
public class Main {
public static void main(String[] args) {
MyCallable myCallable = new MyCallable();
FutureTask<String> futureTask = new FutureTask<>(myCallable);
Thread thread = new Thread(futureTask);
thread.start();
try {
String result = futureTask.get();
System.out.println(result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
class MyTask implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "正在执行任务");
}
}
public class Main {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(3);
for (int i = 0; i < 5; i++) {
executorService.submit(new MyTask());
}
executorService.shutdown();
}
}
// 实例方法锁
public synchronized void method() {}
// 代码块锁
public void method() {
synchronized(this) {
// 临界区
}
}
// 类锁
public static synchronized void staticMethod() {}
ReentrantLock lock = new ReentrantLock(true); // 公平锁
lock.lock();
try {
// 临界区
} finally {
lock.unlock();
}
synchronized(lock) {
while(condition) {
lock.wait(); // 释放锁等待
}
// 处理逻辑
lock.notifyAll();
}
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
lock.lock();
try {
condition.await();
condition.signal();
} finally {
lock.unlock();
}
CountDownLatch latch = new CountDownLatch(3);
// 多个线程调用 latch.countDown()
latch.await(); // 主线程等待
CyclicBarrier barrier = new CyclicBarrier(3, () -> {
System.out.println("所有线程到达屏障");
});
Semaphore semaphore = new Semaphore(5);
semaphore.acquire(); // 获取许可
semaphore.release(); // 释放许可
public final class ImmutableObject {
private final int value;
// 构造器初始化
}
new ThreadPoolExecutor(
corePoolSize, // 核心线程数
maximumPoolSize, // 最大线程数
keepAliveTime, // 空闲线程存活时间
TimeUnit, // 时间单位
workQueue, // 任务队列
threadFactory, // 线程工厂
handler // 拒绝策略
);
掌握Java多线程开发需要理解线程基础、同步机制、线程协作等核心概念,同时要熟悉JUC工具包的使用。建议通过实际项目中的并发场景(如秒杀系统、批量处理等)加深理解,并使用VisualVM、Arthas等工具进行线程状态分析。良好的并发程序设计需要平衡性能与线程安全,避免过度同步导致的性能问题。