JAVA线程用法详解
线程基础知识
线程定义
线程可以理解为轻量级的进程,是程序执行的一条单独的路径。一个程序中通常可以有多个线程同时执行不同的任务,线程之间可以共享程序的数据和资源,因此其效率比多进程更高。
JAVA中,线程是Thread类的实例,在程序中启动和控制线程的执行需要调用Thread类中的方法。
线程状态
线程的状态可以分为以下5种:
- 新建状态(NEW):当线程对象创建后,就进入了新建状态。此时它包含进程空间以及程序计数器等资源,但没有为该线程分配内存和其他资源。
- 就绪状态(RUNNABLE):当线程对象调用start()方法时,该线程就进入了就绪状态,等待CPU执行。此时多个线程可以同时处于就绪状态,但只有一个线程会被CPU选择执行。
- 运行状态(RUNNING):当CPU选择了某个就绪状态的线程开始执行时,该线程就进入运行状态。此时线程正在执行它的任务。
- 阻塞状态(BLOCKED):在某些情况下,一个线程是无法进入运行状态的。比如线程等待某个资源的时候,如果这个资源还没有准备好,该线程就会进入阻塞状态。当然还有一些其他的原因导致线程进入阻塞状态。
- 终止状态(TERMINATED):当线程的run()方法执行完毕或者线程抛出异常而终止运行时,该线程就进入终止状态。
线程创建
JAVA中线程的创建通常有两种方式:
- 继承Thread类,重写run()方法,通过调用start()方法来启动线程。
- 实现Runnable接口,重写run()方法,将Runnable子类的实例作为Thread的构造函数参数,通过调用start()方法来启动线程。
线程同步
JAVA中线程同步一般使用synchronized关键字来完成,它可以用于方法中或者代码块中:
- synchronized方法:将要同步的代码片段作为一个方法,并用synchronized关键字声明方法,同时该方法所在的对象就是同步对象。
- synchronized代码块:将要同步的代码片段放入一个方法中,并用synchronized关键字声明代码块,同时还需要定义一个同步对象,告诉线程哪个对象需要被同步。
示例说明
示例一
public class Example1 extends Thread {
private int threadId;
public Example1(int threadId) {
this.threadId = threadId;
}
@Override
public void run() {
System.out.println("Thread " + this.threadId + " is running.");
}
public static void main(String[] args) {
Example1 thread1 = new Example1(1);
Example1 thread2 = new Example1(2);
thread1.start();
thread2.start();
}
}
本示例中,我们创建了一个继承Thread类的线程类Example1,重写了run()方法,用于在每个线程启动后输出线程的ID。
在main()方法中,我们创建了两个Example1线程实例并启动,分别输出"Thread 1 is running."和"Thread 2 is running."。该示例演示了如何使用线程继承Thread类的方式来创建和启动线程。
示例二
public class Example2 implements Runnable {
private int threadId;
public Example2(int threadId) {
this.threadId = threadId;
}
@Override
public void run() {
synchronized (this) {
for (int i = 0; i < 5; i++) {
System.out.println("Thread " + this.threadId + " is running.");
}
}
}
public static void main(String[] args) {
Example2 example = new Example2(1);
Thread thread1 = new Thread(example);
Thread thread2 = new Thread(example);
thread1.start();
thread2.start();
}
}
本示例中,我们创建了一个实现Runnable接口的线程类Example2,重写了run()方法,用于输出5次线程的ID。同时,我们使用synchronized块来保证线程同步。
在main()方法中,我们创建了一个Example2实例,并将其分别赋给创建的两个Thread对象。这样,每个线程都有一个引用Example2对象的独立实例,并且共享同一线程同步锁,在执行synchronized块的时候可以保证其同步执行。该示例演示了如何使用线程实现Runnable接口的方式来创建和启动线程,并保证线程同步。
总结
线程是JAVA语言中的重要概念,掌握了线程的使用可以让我们更好地利用CPU资源,提高程序的效率。本文章我们介绍了线程的基础知识,包括线程的定义、线程状态、线程创建和线程同步。同时,我们还分享了两个线程例子,演示如何使用线程创建和启动线程,并实现线程同步。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA线程用法详解 - Python技术站