在Java语言中,Thread是线程类,创建Thread对象然后调用其start()方法将启动一个线程,线程启动后将执行run()方法,业务逻辑在run()方法中实现。
创建线程有以下几种方式。
1.继承Thread类
编写一个类,让它继承Thread类,重写Thread的run()方法。
示例:
class MyThread extends Thread {
@Override
public void run() {
System.out.println("线程开始执行");
}
}
public class ThreadTest1 {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
}
}
2.实现Runnable接口,通过Thread启动
在创建Thread的构造方法时传入一个Runnable类型的参数,启动线程后将会调用Runnable的run()方法。
示例:
class MyTask implements Runnable {
@Override
public void run() {
System.out.println("线程开始执行");
}
}
public class RunnableTest {
public static void main(String[] args) {
MyTask task = new MyTask();
Thread thread = new Thread(task);
thread.start();
}
}
3.实现Callback接口,创建FutureTask对象,通过Thread启动
通过FutureTask的get()方法可以获得Callable的call()方法返回的结果。如果call方法尚未返回结果,那么调用FutureTask的get()方法的线程将会一致阻塞直到结果返回。
示例:
public class FutureTaskTest {
public static void main(String[] args) {
FutureTask<Integer> task = new FutureTask<>(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
System.out.println("我被调用了");
Thread.sleep(2000);
return 30;
}
});
Thread thread = new Thread(task);
thread.start();
Integer result = null;
try {
result = task.get();
System.out.println("FutureTask返回结果:"+result);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
4.创建虚拟线程
JDK21新增了一个新的特性──虚拟线程,它旨在改进Java的并发编程模型。传统上,Java使用基于操作系统线程的并发模型,每个线程都需要分配一个操作系统线程来执行,而虚拟线程则提供了一种更高效、更轻量级的线程模型。限于篇幅,这一篇不讲述虚拟线程,我们将在后续章节专门讲述JDK21中的虚拟线程。