继承Thread类:
- 通过继承Java的Thread类并重写其
run()
方法,可以创建一个线程。run()
方法包含了线程要执行的代码。 - 创建Thread子类的实例,并调用其
start()
方法来启动线程。start()
方法会导致线程开始执行,自动调用run()
方法。 - 注意:Java不支持多重继承,因此如果类已经继承了其他类,则不能通过继承Thread类来实现多线程。
public class MyThread extends Thread {
@Override
public void run() {
// 线程执行的代码
}
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start(); // 启动线程
}
}
实现Runnable接口:
- 实现Runnable接口并重写其
run()
方法,也可以创建线程。Runnable接口只有一个方法需要实现,因此这种方式更为灵活,特别是当类已经继承了其他类时。 - 创建Runnable实现类的实例,并将该实例作为参数传递给Thread类的构造函数,从而创建Thread对象。
- 调用Thread对象的
start()
方法来启动线程。
public class MyRunnable implements Runnable {
@Override
public void run() {
// 线程执行的代码
}
public static void main(String[] args) {
Thread thread = new Thread(new MyRunnable());
thread.start(); // 启动线程
}
}
实现Callable接口配合ExecutorService:
- Callable接口与Runnable接口类似,但Callable的
call()
方法可以返回结果,并且可以声明抛出异常。 - 通常使用ExecutorService的
submit()
方法提交Callable任务,并返回一个Future对象,通过Future对象可以获取Callable执行的结果。 - ExecutorService是一个更高级的线程工具,它提供了线程池的管理,包括线程的创建、调度、销毁等,使得线程的使用更加灵活和高效。
import java.util.concurrent.*;
public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
// 线程执行的代码
return "Callable result";
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(new MyCallable());
String result = future.get(); // 获取Callable执行的结果
System.out.println(result);
executor.shutdown(); // 关闭线程池
}
}
除了上述的三种方式,Java还提供了其他高级的多线程编程工具,如ForkJoinPool
用于并行计算,Semaphore
和CountDownLatch
用于同步控制,Atomic
类用于线程安全的变量操作等。
在实际应用中,使用线程池(如ExecutorService
)是更为常见的做法,因为它能更有效地管理和复用线程,避免大量线程的创建和销毁带来的性能开销。同时,在使用多线程时,还需要注意线程安全问题,例如通过同步代码块(synchronized
)或Lock
等机制来确保共享数据的正确性。