手工做的网站,大学科研项目做网站,网站推广软件免费下载安装,网站模块结构图并发编程
为什么需要多线程#xff1f;
由于硬件的发展#xff0c;CPU的核数增多#xff0c;如果仍然使用单线程对CPU资源会造成浪费。同时#xff0c;单线程也会出现阻塞的问题。所以#xff0c;选择向多线程转变。 多线程的使用使得程序能够并行计算#xff0c;提高计…并发编程
为什么需要多线程
由于硬件的发展CPU的核数增多如果仍然使用单线程对CPU资源会造成浪费。同时单线程也会出现阻塞的问题。所以选择向多线程转变。 多线程的使用使得程序能够并行计算提高计算速度。也能够异步执行提供更快的响应速度。
什么是Java多线程并发不安全
多线程并发不安全是指由于多个线程并发执行可能导致执行过程中多个线程抢占一个资源的时候导致的错误。 而Java多线程并发不安全的本质是由于线程本身不具有可见性、原子性、有序性。 而Java对于不安全问题的解决方法是提供了JMMJava内存模型来提供按需禁止缓存和编译优化的方法。 这些方法包括
volatile、synchronized和final三个关键字Happens-Before规则
正确利用这些JMM方法就可以有效的解决上述的不安全问题。
减少多线程的上下文切换 常用的减少上下文切换的执行的方法有
无锁并发编程多线程竞争锁时会引起上下文切换所以多线程处理数据时可以用一些方法来避免使用锁。如将数据的ID按照Hash算法取模分段不同的线程处理不同段的数据。CAS算法:Java的Atomic包使用CAS算法来更新数据而不需要加锁使用最少线程避免创建不需要的线程比如任务很少但是创建了很多线程来处理这样会造成大量线程都处于等待状态。 线程池的主要作用
线程池的设计主要是为了管理线程为了让用户不需要再关系线程的创建和销毁只需要使用线程池中的线程即可。 同时线程池的出现也为性能的提升做出了很多贡献
降低了资源的消耗不会频繁的创建、销毁线程线程池中的线程随取随用。提高了相应速度因为线程是已经创建好的线程所以减少了线程创建的时间。提高了线程的可管理性线程是稀缺资源不能无限制的创建使用线程池使得线程的数量是可控的。即提供了更强大的功能线程池还提供了一些功能比如定时执行、延迟执行、线程存活时间等。
线程池的实现
线程池的实现类是 ThreadPoolExecutor它的继承性UML类图如下 顶层接口Executor提供了一种思想将任务提交和任务执行进行解耦用户无需关心如何创建线程如何调度线程来执行任务用户只需提供Runnable对象将任务的运行逻辑提交到执行器中由Executor框架完成线程的调配和任务的执行部分。
ExecutorSevice增加了一些能力
扩充执行任务的能力补充可以为一个或一批异步任务生成Future的方法提供管控线程池的方法比如停止线程池的运行。
AbstractExecutorService将执行任务的流程串联了起来保证下层的实现只需关注一个执行任务的方法即可。
ThreadPoolExecutor将会一方面维护自身的生命周期另一方面同时管理线程和任务是两者良好的结合从而执行并行任务。
to be continue2024年6月9日10:20:02