线程的实现方式
- 实现Runnable接口
public class RunnableThread implements Runnable {
@Override
public void run() {
System.out.println("用实现Runnable接口实现线程");
}
}
- 继承Thread类
public class ExtendsThread extends Thread {
@Override
public void run() {
System.out.println("用Thread类实现线程");
}
}
- 线程池创建线程
创建线程池设置多个子线程,就会有多个子线程来实现线程创建,默认通过实现线程工厂DefaultThreadFactory
来创建线程,并设置一些默认值,本质还是通过new Thread()
创建线程。
ExecutorService service = Executors.newFixedThreadPool(10);
- 有返回值的Callable创建线程
public class CallableTask implements Callable<Integer> {
@Override
public Integer call() throws Exception {
return new Random().nextInt();
}
}
// 创建线程池
ExecutorService service = Executors.newFixedThreadPool(10);
// 提交任务,返回结果
Future<Integer> submit = service.submit(new CallableTask());
线程的本质
创建线程只有一种方式:构造Thread类
实现线程运行内容的方式的两种方式
方法一:实现
Runnable
接口重写run()
方法,并把Runnable
实例作为target对象,传给Thread
类,最终调用target.run()
方式二:继承
Thread
类,重写Thread
的run()
方法,Thread.start()
最终会执行run()
方法
实现方式的选择
实现Runnable
接口要比继承Thread
类要更好
- 可以把不同的内容进行解耦,权责分明
- 某些情况下可以提升性能,减小开销
- 继承Thread类相当于限制了代码的扩展性