线程的概念:
线程是程序执行的最小单位,它是进程中的一个实体,是被操作系统独立调度和分派的基本单位。一个进程可以包含多个线程,这些线程可以并发执行,共享进程的资源。
线程的启动方式:
- 继承Thread类,重写run()方法,创建Thread类的实例对象,调用start()方法启动线程。
- 实现Runnable接口,重写run()方法,创建Thread类的实例对象,将实现了Runnable接口的对象作为参数传递给Thread类的构造方法,调用start()方法启动线程。
常用方法:
- start()方法:启动线程,使线程进入就绪状态。
- run()方法:线程的执行体,线程启动后会自动调用run()方法。
- sleep()方法:让当前线程休眠指定的时间。
- join()方法:等待其他线程执行完毕,再执行当前线程。
- interrupt()方法:中断线程的执行。
- yield()方法:暂停当前线程,让其他线程有机会执行。
- isAlive()方法:判断线程是否处于活动状态。
- setPriority()方法:设置线程的优先级。
- getName()方法:获取线程的名称。
- currentThread()方法:获取当前线程的引用。
executors创建几种线程池
Java中的Executors类提供了几种线程池的创建方法,下面将介绍其中的几种:
- newFixedThreadPool(int nThreads)
该方法创建一个固定大小的线程池,该线程池中的线程数量始终保持不变,当一个新任务提交时,若当前线程池中的线程数小于corePoolSize,则会创建新的线程执行任务,若当前线程池中的线程数等于corePoolSize,则将任务加入等待队列中。
- newCachedThreadPool()
该方法创建一个可缓存的线程池,该线程池中的线程数可以根据需要自动扩展,若有空闲线程,则会重用空闲线程,若无空闲线程,则创建新的线程执行任务。
- newSingleThreadExecutor()
该方法创建一个单线程的线程池,该线程池中只有一个线程,所有任务按照指定顺序执行,即每个任务都必须在前一个任务执行完成后才能执行。
- newScheduledThreadPool(int corePoolSize)
该方法创建一个定时任务的线程池,该线程池中的线程数可以根据需要自动扩展,可以定时执行任务或周期性执行任务。
线程池7个参数的详细概念:
- corePoolSize:线程池中的核心线程数,当有新任务提交时,若当前线程池中的线程数小于corePoolSize,则会创建新的线程执行任务。
- maximumPoolSize:线程池中允许的最大线程数,当等待队列满了且当前线程池中的线程数小于maximumPoolSize时,会创建新的线程执行任务。
- keepAliveTime:线程池中的线程空闲时间,当线程空闲时间超过keepAliveTime时,线程会被销毁,直到线程池中的线程数不超过corePoolSize。
- unit:keepAliveTime的时间单位。
- workQueue:等待队列,用于存储等待执行的任务,当当前线程池中的线程数等于corePoolSize时,新提交的任务会被加入等待队列中。
- threadFactory:线程工厂,用于创建新的线程。
- handler:拒绝策略,用于处理无法处理的任务,默认为AbortPolicy,即直接抛出异常。