继承Thread类
这是创建线程的基本方式之一。你需要创建一个新的类,该类继承自Thread
类,并重写run()
方法。然后,你可以创建这个类的一个实例并调用它的start()
方法来启动新线程。
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接口
这种方式比继承Thread
类更加灵活,因为Java不支持多重继承,但可以实现多个接口。你需要创建一个类实现Runnable
接口,并重写run()
方法。然后,你可以将这个类的实例作为参数传递给Thread
类的构造函数来创建线程。
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(); // 启动线程 }
}
实现Callable接口
Callable
接口类似于Runnable
接口,但它可以返回一个结果并可能抛出异常。Future
接口用于获取Callable
任务的结果。通常,我们使用FutureTask
类,它实现了Future
和Runnable
接口,因此可以作为Thread
的目标来运行。
public class MyCallable implements Callable<String> { @Override public String call() throws Exception { // 线程执行的代码 return "MyCallable 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(); // 获取结果 System.out.println(result); executor.shutdown(); // 关闭执行器 }
}
线程池
线程池是一种更高级的用法,它可以管理和复用线程,以减少创建和销毁线程的开销。Java提供了多种线程池实现,如FixedThreadPool
、CachedThreadPool
等。你可以使用Executors
工厂类来创建线程池。
ExecutorService executor = Executors.newFixedThreadPool(10); // 创建一个固定大小的线程池
executor.submit(new MyRunnable()); // 提交任务给线程池
executor.shutdown(); // 关闭线程池
请注意,当你使用线程池时,你应该在适当的时候关闭它,以避免资源泄漏。通常,在提交完所有任务后,你应该调用shutdown()
或shutdownNow()
方法来关闭线程池。