1、创建线程的四种方式
1、通过继承Thread类实现,复写run方法
特点:继承Tread类,实例化一个线程时,调用start()也只能启动一个线程。实例化多个线程实例,每个实例调用start()可以启动多个线程,但线程中的资源也是多份的。
2、实现Runnable接口,复写run方法
特点:实现Runnable接口只需要实例化一个线程类就可以创建多个线程,并且多个线程共享同一份资源
继承了Tread类后不能同时继承其它类了,而实现了Runnable接口后还可实现其它接口和继承其它类。
Thread本身也是Runnable接口的一个实现类。
3、实现Callable
call方法中可以有返回值,并且抛出异常。Runnable的run方法无返回值。
4、创建线程池实现
就是创建一个实现多个线程的容器
线程池提供了一个线程队列,队列中保存所有等待状态的线程,避免创建与销毁额外开销,提高了响应速度。
2、线程池
2.1 线程池的7个参数?
corePoolSize 核心线程池基本大小,核心线程数
maximumPoolSize 线程池最大线程大小
keepAliveTime 线程空闲后的存活时间
TimeUnit unit 线程空闲后的存活时间单位
BlockingQueue workQueue 存放任务的阻塞队列
ThreadFactory threadFactory 创建线程的工厂
RejectedExecutionHandler handler 当阻塞队列和最大线程池都满了之后的饱和策略
2.2 线程池的提交两种方式的区别?
execute()和submit()
第一种区别:
1、execute只能提交Runnable类型的任务,无返回值。
2、submit既可以提交Runnable类型的任务,也可以提交Callable类型的任务,会有一个类型为Future的返回值,但当任务类型为Runnable时,返回值为null。
第二种区别:
execute在执行任务时,如果遇到异常会直接抛出,而submit不会直接抛出,只有在使用Future的get方法获取返回值时,才会抛出异常