在 Java 中,线程是程序执行的最小单元,它被包含在进程之中.是进程中的实际运作单位,允许程序并发执行多个任务,提高系统资源的利用率;比如.如果一个线程完成一个任务要 100 毫秒.那么用十个线程完成改任务只需 10 毫秒。Java 提供了多种方式来创建和管理线程,同时也提供了丰富的 API 来处理线程间的同步、通信和调度。
线程和进程的区别
线程是进程的子集.一个进程可以有很多线程.每条线程并行执行不同的任务。
不同的进程使用不同的内存空间.而所有的线程共享一片相同的内存空间。每个线
程都拥有单独的栈内存用来存储本地数据
创建线程的方式
1. 继承 Thread 类
class MyThread extends Thread {
public void run() {
// 线程执行的任务
}
}
// 创建并启动线程
MyThread thread = new MyThread();
thread.start();
2. 实现 Runnable 接口
class MyRunnable implements Runnable {
public void run() {
// 线程执行的任务
}
}
// 创建 Runnable 实例并作为参数传递给 Thread 对象
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
线程状态
- NEW(新建):线程被创建但未启动。
- RUNNABLE(就绪):等待 CPU 时间片段,可以运行。
- BLOCKED(阻塞):等待获取锁或其他条件。
- WAITING(等待):无限期等待其他线程的通知。
- TIMED_WAITING(定时等待):带有超时时间的等待状态。
- TERMINATED(终止):线程执行完毕或因异常退出。
线程方法和操作
start()
:启动线程,调用run()
方法执行任务。join()
:等待线程终止。sleep()
:线程休眠一段时间。yield()
:让出 CPU 时间,使同优先级线程有机会执行。interrupt()
:中断线程的执行。isAlive()
:检查线程是否存活。setPriority()
和getPriority()
:设置和获取线程优先级。
线程同步与互斥
synchronized
关键字:确保多个线程对共享资源的安全访问。wait()
、notify()
、notifyAll()
:用于线程间的通信和同步。
线程池
java.util.concurrent.ExecutorService
管理线程池,提供对线程的复用、调度和管理。
并发编程工具
java.util.concurrent
包提供 Lock
、Semaphore
、CountDownLatch
等工具类,处理并发编程中的同步和线程间通信问题。
线程安全与注意事项
多线程编程需要注意线程安全性、资源共享、死锁等问题,并遵循最佳实践以确保程序的正确性和性能。对共享资源的访问需要进行合适的同步控制,避免出现竞态条件和数据不一致的情况。
Java 提供的并发包
Java 并发包 (java.util.concurrent
) 提供了各种工具和类来简化并发编程,包括线程池、同步器、原子变量、阻塞队列等,可以更方便地实现高效、安全的多线程应用程序。