Java并发编程的核心之一就是线程(Thread)。线程是程序执行流的最小单元,Java通过线程来实现并发编程。以下是Java线程的一些基础概念:
1. 线程的创建
在Java中,创建线程主要有两种方式:
- 继承Thread类:
通过继承Thread
类并重写其run()
方法,可以创建一个线程。然后调用该线程的start()
方法启动线程,这会自动调用run()
方法。
java
public class MyThread extends Thread {
@Override
public void run() {
// 线程执行的代码
System.out.println("MyThread is running");
}
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start(); // 启动线程
}
}
- 实现Runnable接口:
通过实现Runnable
接口并重写其run()
方法,可以创建一个线程任务。然后可以将这个任务作为参数传递给Thread
类的构造函数来创建线程,并调用start()
方法启动线程。
java
public class MyRunnable implements Runnable {
@Override
public void run() {
// 线程执行的代码
System.out.println("MyRunnable is running");
}
public static void main(String[] args) {
Thread thread = new Thread(new MyRunnable());
thread.start(); // 启动线程
}
}
2. 线程的状态
Java线程具有五种状态:
- 新建(New):新创建了一个线程对象。
- 就绪(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
- 运行(Running):就绪状态的线程获取了CPU,执行程序代码。
- 阻塞(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。
- 死亡(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
3. 线程的控制
Java提供了一些方法来控制线程的执行:
start()
:启动线程,执行run()
方法。run()
:线程在被调度时执行的任务代码。sleep(long millis)
:使当前线程(即调用该方法的线程)暂停执行一段时间(以毫秒为单位)。interrupt()
:中断线程。中断的线程将会收到一个中断信号,线程可以选择响应中断(结束线程或做其他处理),也可以忽略中断。join()
:等待其他线程终止。当前线程调用另一个线程的join()
方法,则当前线程将被阻塞,直到另一个线程运行结束,当前线程才可继续执行。isAlive()
:判断线程是否存活。currentThread()
:返回对当前正在执行的线程对象的引用。
4. 线程的优先级
Java中的线程有优先级,优先级高的线程获得更多的执行机会。但线程的优先级并不能保证线程的执行顺序。线程的优先级用整数表示,范围从1(最低优先级)到10(最高优先级)。Java线程的默认优先级是5。
可以通过setPriority(int priority)
方法设置线程的优先级,通过getPriority()
方法获取线程的优先级。
5. 线程安全
多线程并发访问共享数据时可能会出现线程安全问题。Java提供了多种机制来保证线程安全,如synchronized
关键字、volatile
关键字、Lock
接口等。