文章目录
- 1. java创建线程(Thread)方式
- 2. 继承 Thread 类
- 3. 实现 Runnable 接口
- 4. 实现 Callable 接口
- 5. 使用线程池
- 6. 使用匿名类
1. java创建线程(Thread)方式
方式一:继承于Thread类,这是最常见的创建线程的方式之一,通过继承 Thread 类并重写其 run() 方法来定义线程要执行的任务。
方式二:实现Runnable接口,这是另一种常见的创建线程的方式,通过实现 Runnable 接口并将其作为参数传递给 Thread 类来创建线程。
方式三:实现Callable接口,Callable 接口与 Runnable 类似,但它可以返回线程执行的结果,并且可以抛出异常。
方式四:使用线程池,线程池可以重用线程并且可以控制并发线程的数量,是一种高效的管理线程的方式。
方式五:使用匿名类,可以使用匿名类直接创建线程,适用于任务较为简单的情况。
2. 继承 Thread 类
步骤:
- 创建一个继承自 Thread 类的子类。
- 重写 Thread 类的 run() 方法,定义线程要执行的任务。
- 创建子类的实例对象,并调用 start() 方法启动线程。
优点:
- 实现简单,无需创建额外的类。
- 可以直接通过继承来定义线程要执行的任务。
缺点:
- 由于 Java 是单继承的,如果已经继承了其他类,则无法再使用这种方式创建线程。
- 与实现 Runnable 接口相比,代码的灵活性稍差。
class MyThread extends Thread {public void run() {// 线程执行的任务}
}// 启动线程
MyThread myThread = new MyThread();
myThread.start();
3. 实现 Runnable 接口
步骤:
- 创建一个实现了 Runnable 接口的类。
- 实现接口中的 run() 方法,定义线程要执行的任务。
- 创建该类的实例对象,并将其传递给 Thread 类的构造函数。
- 调用 Thread 对象的 start() 方法启动线程。
优点:
- 灵活性高,一个类可以同时实现多个接口。
- 适用于多线程共享同一个实例的情况。
缺点:
- 由于 Java 不支持多重继承,如果类已经继承了其他类,则无法使用这种方式。
class MyRunnable implements Runnable {public void run() {// 线程执行的任务}
}// 启动线程
Thread thread = new Thread(new MyRunnable());
thread.start();
4. 实现 Callable 接口
步骤:
- 创建一个实现了 Callable 接口的类。
- 实现接口中的 call() 方法,定义线程要执行的任务,并可以返回执行结果。
- 创建 FutureTask 对象,将 Callable 对象传递给它。
- 创建 Thread 对象,将 FutureTask 对象传递给它。
- 调用 Thread 对象的 start() 方法启动线程。
优点:
- 可以返回任务执行的结果。
- 支持线程间的异常处理。
缺点:
- 相对于 Runnable 接口,实现稍微复杂一些。
- 不支持在构造函数中传递参数。
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;class MyCallable implements Callable<String> {public String call() {// 线程执行的任务,并返回结果return "Task Completed";}
}// 启动线程
FutureTask<String> futureTask = new FutureTask<>(new MyCallable());
Thread thread = new Thread(futureTask);
thread.start();
5. 使用线程池
步骤:
- 创建一个 ExecutorService 对象,通常使用 Executors 工厂类创建。
- 创建一个实现 Runnable 接口的任务对象。
- 调用 ExecutorService 对象的 execute() 方法提交任务。
- 在任务执行完毕后,调用 ExecutorService 对象的 shutdown() 方法关闭线程池。
优点:
- 重用线程,减少线程创建和销毁的开销。
- 控制并发线程数,防止资源被耗尽。
缺点:
- 如果任务队列过长,可能会导致任务排队等待,影响性能。
- 如果线程池大小设置不合理,可能会出现线程过多或过少的问题。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;ExecutorService executor = Executors.newFixedThreadPool(5);Runnable task = () -> {// 线程执行的任务
};executor.execute(task);
executor.shutdown();
6. 使用匿名类
步骤:
- 使用匿名类实现 Runnable 或 Callable 接口。
- 实现接口中的 run() 或 call() 方法,定义线程要执行的任务。
- 创建 Thread 对象,将匿名类对象传递给它。
- 调用 Thread 对象的 start() 方法启动线程。
优点:
- 不需要额外定义类,代码简洁。
- 适用于任务较为简单的情况。
缺点:
- 无法重复使用,不利于代码的复用。
- 匿名类的作用域有限,只能在创建线程的地方使用。
// 使用匿名类实现 Runnable 接口
Runnable runnable = new Runnable() {public void run() {// 线程执行的任务}
};// 启动线程
Thread thread = new Thread(runnable);
thread.start();