多线程—–每日学习笔记

多线程理解学习:

多线程

百度百科:多线程(multithreading),是指从软件或硬件上实现多个线程并发执行的请求具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。在一个程序中,这些独立运行的程序片段叫做“线程”(Thread),利用它编程的概念就叫做“多线程处理”。

进程与线程区别:
进程:一个程序就是一个进程例如我正在运行的微信,网易云等都属于一个进程。

线程:线程是运行在计算机操作系统上运算调度最小的单位,它包含在我们的进程中,在统一进程中线程拥有该进程的全部系统资源。

并行与并发:

举个例子:

例1:

  • 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
  • 你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。 (不一定是同时的)
  • 你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。

例2:

  • 你在打游戏,女朋友突然打来了视频电话,如果你无视女朋友的电话,一直到游戏结束才回她电话,这就说明你不支持并发,也不支持并行。
  • 你在打游戏中,女票来了电话,你赶紧接了电话,放下了手头的游戏,等你女票电话结束你才继续玩你的游戏,这说明你支持并发。(不一定是同时的)
  • 你玩游戏玩到一半,女票来了电话,你一边接电话一边打你的游戏说明你支持并行。

并发的关键是你有处理多个任务的能力,不一定要同时;
并行的关键是你有同时处理多个任务的能力。
所以我认为它们最关键的点就是:是否是『同时』。并发是轮流处理多个任务,并行是同时处理多个任务

线程池:

线程的创建方式:Java就是一个天生的多线程语言。在我们运行main方法的时候,其实就是创建并启动了一个main线程。

线程的状态(五种):
1.新建新创建一个线程。
2.就绪:线程对象创建后,其他线程(比如main线程)调用了该对象的start( )方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权。
3.运行:获取了CPU的使用权。
4.阻塞:线程可能被挂起,或者被中断,让出CPU的使用权。
5.死亡:线程run()、main()方法执行结束,或者因异常退出了run()方法。则该线程结束生命周期。死亡的线程不可再次复生。

多线程-----每日学习笔记

创建线程
返回结果

为什么需要线城池/strong>
线程的创建和销毁都会消耗系统的资源,将线程放在一个缓存池,需要使用时直接从缓存池中获取线程,通过重用使用已创建的线程来降低系统所消耗的能源。

线程池的使用:
在Executor类中有4种线程池的创建方法。
1.newCachedThreadPool():创建一个缓存线程池,创建线程数量不限制,线程长时间未使用会被回收,如果有大量线程同时运行可能会导致系统瘫痪。SynchronousQueue(同步队列):内部只能包含一个元素的队列。

2.newFixedThreadPool():创建固定线程的线程池,LinkedBlockingQueue队列中大小是不限的,所有可能会出现内存溢出的情况。

3.newSIngleTreadExecutor()创建一个只有一个线程的线程池,俗称单例线程池同样也是采用的LinkedBlockingQueue.

4.newScheduledThreadPool():创建一个定长的线程池,而且支持定时的以及周期性的任务执行,支持定时及周期性任务执行。

线程池使用注意事项:
阿里开发规范(原文):
【强制】线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这
样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
说明:Executors 返回的线程池对象的弊端如下:
1) FixedThreadPool 和 SingleThreadPool:
允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。
2) CachedThreadPool:
允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。

ThreadPoolExecutor:

参数说明:
corePoolSize:核心线程数
maximumPoolSize:最大线程数
keepAliveTime:线程保持活跃时间
unit:线程活跃时间的单位
workQueue:任务队列
threadFactory:线程工厂,线程创建的方式
handler:拒绝策略

TimeUnit类,配合keepAliveTime使用指定时间格式

纳秒 NANOSECONDS
微秒 MICROSECONDS
毫秒 MILLISECONDS
秒 SECONDS
分 MINUTES
时 HOURS
天 DAYS

拒绝策略

  • RejectedExecutionHandler:ThreadPoolExecutor提供了四种拒绝策略
    1.AbortPolicy(默认使用):抛出异常

来源:春眠不觉晓?

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年10月8日
下一篇 2020年10月8日

相关推荐