并发:当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再见时间段分配给各个线程执行,在一个时间段的线程代码运行时,其他线程处于挂起状。这种方式我们称之为并发(Concurrent)。
多线程的优点
资源利用率更好
程序设计更简单
程序响应更快
多线程的代价
设计更复杂(底层)
上下文切换的开销
增加资源消耗
Java中怎么应用线程?
- 继承Thread类(就绪状态)
- 实现Runable接口(可运行状态,可以实现资源共享)
- 实现Callable接口
线程池的优点
1.重用线程池的线程,避免因为线程的创建和销毁锁带来的性能开销
2.有效控制线程池的最大并发数,避免大量的线程之间因抢占系统资源而阻塞
3.能够对线程进行简单的管理,并提供一下特定的操作如:可以提供定时、定期、单线程、并发数控制等功能。
线程池的参数
1.corePoolSize 线程池中核心线程的数量
2.maximumPoolSize 线程池中最大线程数量
3.keepAliveTime 非核心线程的超时时长,当系统中非核心线程闲置时间超过keepAliveTime之后,则会被回收。如果ThreadPoolExecutor的allowCoreThreadTimeOut属性设置为true,则该参数也表示核心线程的超时时长
4.workQueue 线程池中的任务队列,该队列主要用来存储已经被提交但是尚未执行的任务。存储在这里的任务是由ThreadPoolExecutor的execute方法提交来的。
5.threadFactory 为线程池提供创建新线程的功能,这个我们一般使用默认即可
6.handler 拒绝策略,当线程无法执行新任务时(一般是由于线程池中的线程数量已经达到最大数或者线程池关闭导致的),默认情况下,当线程池无法处理新线程时,会抛出一个RejectedExecutionException。
7.unit 第三个参数的单位,有纳秒、微秒、毫秒、秒、分、时、天等
Executors可以创建4种类型的ThreadPoolExecutor:SingleThreadExecutor、FixedThreadExecutor和CachedThreadPool 和ScheduledThreadPool
笔记待补充。。。。。