线程创建的几种方式
线程创建的几种方式
1.继承Thread类
最为简单直接的方式,直接通过继承Thread
类,并重写run()
方法。
步骤:
创建一个类继承
Thread
。重写
run()
方法,将线程要执行的的代码写在run
方法中。创建线程对象,通过
start()
方法启动线程。
示例:
1 | public class MyThread extends Thread{ |
特点:
简单直接,适合快速创建简单线程。
由于
Java
不支持多继承,如果已经继承了其他类,就不能使用这种方式。
2.实现Runnable接口
相比于继承Thread
,实现Runnable
接口更为灵活,可以避免java
单继承的限制
步骤:
创建一个类实现
Runnable
接口。实现
run()
方法,将线程要执行的的代码写在run
方法中。创建
Thread
对象,并将Runnable
对象传递给Thread
的构造方法。调用
start()
方法启动线程。
示例:
1 | public class MyRunnable implements Runnable{ |
特点:
更灵活,可以实现
Runnable
接口的同时继承其他类。更加适合资源共享场景,可以将同一个
Runnable
实例传递给多个线程。
3.使用callable和Future
Callable
和 Runnable
类似,但 Callable
可以有返回值,并且可以抛出异常。需要配合 Future
或 FutureTask
使用。
步骤:
- 创建一个类实现
Callable
接口。 - 实现
call()
方法 ,并定义返回值类型 - 使用
ExecutorService
提交任务,获得Future
对象 - 通过
Future
的get()
方法获得线程结果。
示例:
1 | public class MyCallable implements Callable<Integer> { |
特点:
- 可以获取线程的执行结果。
- 支持抛出异常的处理。
- 更加适合复杂的线程操作,特别是需要返回结果时。
4.使用线程池(ExecutorService)
线程池管理一组线程,可以避免频繁创建和销毁线程的开销,提高性能。
步骤:
- 创建一个线程池,例如使用
Executors
类。 - 将任务提交给线程池执行。
- 线程池可以管理多个线程的执行,并可复用现有线程。
示例:
1 | public class Main { |
特点:
- 提高了资源利用率,特别适合大量短小任务的执行。
- 可以控制线程的数量,避免过多线程导致的资源竞争。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Luyseon Blog!