在Java中创建线程主要有三种方式:
-
继承
Thread
类
这是最传统的创建线程的方式。你需要创建一个Thread
类的子类,并重写run()
方法。在run()
方法中编写线程要执行的代码。然后,实例化这个子类并调用start()
方法来启动线程。class MyThread extends Thread {public void run() {// 线程执行的代码System.out.println("Hello from MyThread!");} }public class Main {public static void main(String[] args) {MyThread thread = new MyThread();thread.start();} }
-
实现
Runnable
接口
另一种创建线程的方式是实现Runnable
接口。这种方式的好处是可以避免由于Java的单继承限制带来的问题,因为你可以同时实现多个接口。你创建一个实现了Runnable
接口的类,并在run()
方法中定义线程的行为。然后,将这个Runnable
对象传递给Thread
类的构造函数,创建并启动线程。class MyRunnable implements Runnable {public void run() {// 线程执行的代码System.out.println("Hello from MyRunnable!");} }public class Main {public static void main(String[] args) {Thread thread = new Thread(new MyRunnable());thread.start();} }
-
使用
Callable
和FutureTask
如果你想从线程中返回一个结果,可以使用Callable
接口。Callable
接口类似于Runnable
,但它的call()
方法可以返回一个结果,并且它可以抛出异常。你需要将Callable
对象包装到FutureTask
中,然后将FutureTask
传给Thread
对象。import java.util.concurrent.Callable; import java.util.concurrent.FutureTask;public class Main {public static void main(String[] args) {Callable<Integer> callable = () -> {// 线程执行的代码return 42;};FutureTask<Integer> futureTask = new FutureTask<>(callable);Thread thread = new Thread(futureTask);thread.start();try {int result = futureTask.get(); // 获取结果System.out.println("Result: " + result);} catch (Exception e) {e.printStackTrace();}} }
此外,现代Java开发中,创建线程的另一种常见方式是使用ExecutorService
和ThreadPoolExecutor
,它们允许你创建线程池来管理线程的生命周期,这对于处理大量并发任务非常有用。这种方式通常结合Runnable
或Callable
使用。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Main {public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(5); // 创建一个固定大小的线程池for (int i = 0; i < 10; i++) {Runnable worker = new WorkerThread(i);executor.execute(worker); // 提交任务}executor.shutdown(); // 关闭线程池while (!executor.isTerminated()) {}System.out.println("Finished all threads");}
}class WorkerThread implements Runnable {private int id;public WorkerThread(int id) {this.id = id;}@Overridepublic void run() {System.out.println("Hello from thread with ID: " + id);}
}
每种方法都有其适用场景,选择合适的方式取决于你的具体需求,如是否需要返回结果、是否需要避免类的单继承限制等。