线程(二)
1、创建线程有哪几种方式?你喜欢哪种?为什么?
创建线程的方式有三种:继承Thread类、继承Runnable接口以及继承Callable接口。一般情况下我会继承Runnable接口实现多线程,这样可以避免类只能单继承的缺点,当需要得到线程的返回值时我会使用Callable接口。当然,日常开发的时候我一般都是通过Executors接口来创建线程池。
2、请解释下java线程回调是什么意思?
所谓回调,程序C调用了程序S中的某个方法A,而程序S又在某个时候反过来调用程序C中的某个方法B,对于C来说,B就是回调方法。
3、请列举下启动线程有哪几种方式?再列举下线程池的种类有哪些?
(1)、线程的启动只能通过Thread.start()方法,如果是继承Runnable接口创建的线程,则需要将Runnable接口实现类传递至Thread类的构造方法中再调用Thread.start()方法。如果是通过继承Callable接口创建线程,则需要通过FutureTask类使Callable接口与Thread类建立联系,从而调用Thread.start()方法启动线程。如果继承Thread类创建的线程,则直接调用start()方法即可。
(2)、java中可以通过调用Executors类创建线程池,线程池的种类分为以下四种:
- newSingleThreadExecutor:创建单线程化的线程池,保证按指定顺序执行任务。
- newCachedThreadPool():创建可缓存线程池,线程容量最大为Integer.MAX_VALVE
- newFixedThreadPool(int):创建指定容量的线程池。
- newScheduledThreadPool():适用于周期性或者定时执行任务的线程,线程容量最大为Integer.MAX_VALVE
4、请简要说明下java中CyclicBarrier和CountDownLatch的区别?
- CountDownLatch是一次性的,CyclicBarrier可以被重置而重复使用。
- CountDownLatch一般用于一个或者n个线程等待其他线程完成某项操作之后再继续执行。CyclicBarrier用于一组线程互相等待至某个状态后再一起执行。
5、请说明线程池有什么优势?
(1)、降低资源消耗:通过重复利用线程池中已创建的线程降低线程创建和销毁造成的消耗。
(2)、提高响应速度:当任务到达时,不需要等待线程创建可以直接执行任务。
(3)、提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统的资源,还会降低系统的稳定性,使用线程池可以统一分配、调优和监控。
6、请简述线程池的运行流程,使用参数以及方法策略等?
线程池主要就是指定核心线程数,最大线程数,存储队列,拒绝策略,空闲线程存活时长。当任务提交给线程池之后,如果当前线程池中线程的数目小于核心线程数,则创建一个新的线程去执行任务。如果当前线程池中的线程数大于核心线程数,则每来一个任务,会尝试将其添加到任务缓存队列当中,如果添加成功,如果添加成功,则任务会等待空闲线程将任务取出执行;如果任务缓存队列已满,则会尝试创建新的线程去执行这个任务,如果当前线程池中的线程数目达到了最大线程数,则会采用拒绝策略进行处理。当线程池中的线程数目大于核心线程数时,多余空闲线程空闲时间超过了空闲线程线程存活时长则会销毁,直到线程池中的线程数目不大于核心线程数。
7、请介绍下什么是生产者-消费者模式?
生产者-消费者模式是线程模型中的经典问题:生产者和消费者在一段时间内共用同一存储空间,生产者向存储空间存储数据,消费者从存储空间取走数据。
8、多线程中的i++是线程安全的吗?为什么?
不安全。因为i++不是原子性操作。i++操作分为几步,执行期任何一步都可能被其他线程抢占。

浙公网安备 33010602011771号