线程的概述
Thread
是 Java 中用于实现多线程的一种机制,它是一个轻量级的进程,可以让程序并发地执行多个任务。在 Java 中,Thread
类代表了一个线程,线程是程序执行的基本单元。通过多线程,可以提高程序的效率,特别是在涉及到大量 I/O 操作或 CPU 密集型计算的场景下。
一、创建线程的两种常见方式
1. 继承 Thread
类
你可以通过继承 Thread
类并重写它的 run()
方法来创建一个线程。run()
方法定义了线程执行的任务。
示例:
class MyThread extends Thread {
@Override
public void run() {
System.out.println("线程 " + Thread.currentThread().getName() + " 正在执行任务");
}
}
public class Main {
public static void main(String[] args) {
MyThread thread1 = new MyThread();
MyThread thread2 = new MyThread();
thread1.start(); // 启动线程1
thread2.start(); // 启动线程2
}
}
解析:
MyThread
类继承自Thread
类,重写了run()
方法,定义了线程的任务。- 调用
start()
方法启动线程,底层会调用run()
方法执行线程任务。 Thread.currentThread().getName()
用来获取当前线程的名字,默认为“main”线程或线程池的线程名。
2. 实现 Runnable
接口
另一种创建线程的方式是实现 Runnable
接口,Runnable
接口只定义了一个 run()
方法,不包含线程的控制逻辑。实现 Runnable
接口后,可以将其传递给 Thread
对象的构造函数来创建线程。
示例:
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("线程 " + Thread.currentThread().getName() + " 正在执行任务");
}
}
public class Main {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread1 = new Thread(myRunnable);
Thread thread2 = new Thread(myRunnable);
thread1.start(); // 启动线程1
thread2.start(); // 启动线程2
}
}
解析:
MyRunnable
类实现了Runnable
接口,并重写了run()
方法。- 创建了两个
Thread
对象,并将MyRunnable
实例传递给Thread
的构造函数。 - 调用
start()
启动线程,线程执行run()
方法。
二、线程的生命周期
线程的生命周期包括以下几个阶段:
- 新建(New):线程对象被创建但尚未调用
start()
方法时处于此状态。 - 就绪(Runnable):线程调用了
start()
方法,线程进入就绪状态,等待系统调度器分配 CPU 时间片。 - 运行(Running):线程被调度器分配到 CPU 时间片后,线程进入运行状态,执行
run()
方法中的任务。 - 阻塞(Blocked):线程因为某些条件(例如等待锁、I/O 操作)无法继续执行,进入阻塞状态。
- 死亡(Dead):线程执行完
run()
方法后,线程生命周期结束,进入死亡状态。
三、线程同步
在多线程环境中,多个线程可能会同时访问共享资源,这时候可能会产生竞争条件,导致程序出现错误。为了防止这种情况,需要对共享资源进行同步。
示例:
class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public int getCount() {
return count;
}
}
public class Main {
public static void main(String[] args) {
Counter counter = new Counter();
// 创建多个线程并执行任务
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter.increment();
}
});
Thread thread2 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter.increment();
}
});
thread1.start();
thread2.start();
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("最终计数值:" + counter.getCount());
}
}
解析:
increment()
方法使用了synchronized
关键字,确保了在同一时刻只有一个线程能进入该方法,从而避免了多个线程同时修改count
变量的竞争条件。thread1.join()
和thread2.join()
确保主线程等待thread1
和thread2
执行完成后再输出结果。
四、线程的优先级
每个线程都可以设置优先级,优先级的范围是从 Thread.MIN_PRIORITY
(1)到 Thread.MAX_PRIORITY
(10)。线程调度器会尽量优先调度优先级高的线程。
示例:
class MyThread extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " 执行");
}
}
public class Main {
public static void main(String[] args) {
MyThread thread1 = new MyThread();
MyThread thread2 = new MyThread();
thread1.setPriority(Thread.MAX_PRIORITY);
thread2.setPriority(Thread.MIN_PRIORITY);
thread1.start();
thread2.start();
}
}
解析:
setPriority()
方法用于设置线程的优先级。- 线程的调度是由操作系统决定的,设置线程优先级可以影响线程的调度顺序,但并不保证会按优先级执行。
五、总结
Thread
类是 Java 中实现并发编程的核心,通过创建多个线程可以实现任务的并发执行。我们可以通过继承 Thread
类或实现 Runnable
接口来创建线程。多线程的同步机制(如 synchronized
)确保了共享资源的安全性。线程的优先级可以通过 setPriority()
方法进行调整,但最终的调度还是由操作系统来决定。
原文地址:https://blog.csdn.net/2401_83418369/article/details/143863531
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!