线程与进程的区别
1, 进程是一个可以独立执行的单元,一个进程就是一个应用程序;而线程则是进程中一个任务的执行单元。线程是进程的子集。
2, 进程拥有独立的内存地址,而线程则是共享一块连续的内存。线程的实现有哪些方式,哪种方式更好
1, 继承Thread类
2, 实现Runable接口
由于java不支持多继承,支持多实现。故实现runable接口相对来说更好。线程的start、run 方法的区别 ;wait 、sleep 、notify 、join 、yeild 分别是什么
1, 线程的start方法是开启一个新线程,而run方法则和普通的方法一样执行,不能开启一个新线程。
2, wait 方法可以让当前线程暂停执行,并且是放弃对象锁的。当调用notify方法后使得当前线程进入等锁池;sleep方法可以让当前线程休眠一定的时间,只是并不释放掉对象锁,当休眠时间到了,立即转入到就绪状态;notify方法是随机选择一个在当前对象上执行wait方法的线程,解除其阻塞状态。(ps:当前线程必须是锁的持有者)
3, join方法让调用该方法的thread完成run方法里面的内容执行完毕,再去执行join后面的代码段;yeild方法线程放弃运行,将cpu的控制权让出来。它与sleep的不同之处在:它让出控制权之后,可能由于优先级较高会马上再次获得执行机会,进而接着运行。而sleep则是在指定的时间之内一定不会再次获得cpu执行权,必须等到休眠时间完成。线程调度策略
抢占式调度策略
时间片轮转调度策略-
多线程
好处:1, 降低创建销毁线程的资源消耗 2, 提高响应速度 3, 提高线程的可管理性
概念:线程池的顶级接口是Executor,真正的线程池接口是ExecutorService,它的具体实现的ThreadPoolExecutor。普通类Executors里面调用的就是ThreadPoolExecutor。
创建一个线程池:ExecutorService pool = Executors.newCachedThreadPool();Executors提供四种线程池:
1,newCachedThreadPool,可根据需要创建新线程的线程池
2,newSingleThreadPool,只有一个线程的线程池
3,newFixedThreadPool,固定大小的线程池
4,newScheduledThreadPool,大小无限的线程池线程池相关参数:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
threadFactory, defaultHandler);
}
1,corePoolSize 线程池的核心线程数,一般情况下,不管有没有任务都会在线程池中存在
2, maximumPoolSize 最大线程数量,当活动的线程数达到这个数字后,后面的任务将会被阻塞。
3, keepAliveTIme 控制闲置线程存活时间,一般用在非核心线程。
4, unit 指定keepAliveTime的时间单位,是枚举类型,主要有 TimeUnit.HOURS、TimeUnit.MINUTES
5, workQueue 线程池的任务队列
6, threadFacory 线程工厂,它是一个接口,用来为线程池创建新的线程
线程池的关闭:shutdown ,不会立即终止线程池,而是要等到任务缓存队列中的任务都执行完毕才终止,不会接受新的任务。shutdownNow,立即关闭线程池,并尝试打断正在执行的任务,清空缓存队列,返回未执行的任务。
Executor框架:是一个根据一组执行策略调度、执行、控制异步任务的框架。
Executors类:用于方便的创建线程池。
- 线程池工作原则
1、当线程池中线程数量小于 corePoolSize 则创建线程,并处理请求。
2、当线程池中线程数量大于等于 corePoolSize 时,则把请求放入 workQueue 中,随着线程池中的核心线程们不断执行任务,只要线程池中有空闲的核心线程,线程池就从 workQueue 中取任务并处理。
3 、当 workQueue 已存满,放不下新任务时则新建非核心线程入池,并处理请求直到线程数目达到 maximumPoolSize(最大线程数量设置值)。
4、如果线程池中线程数大于 maximumPoolSize 则使用 RejectedExecutionHandler 来进行任务拒绝处理。