java并发编程基础

时间:2022-11-10 18:02:18

一、线程简介

  什么是线程:

    现在操作系统在运行一个程序时,会为其创建一个进程。例如,启动一个java程序,操作系统就会创建一个java进程。现代操作系统调度的最小单元是线程,也叫轻量级进程,在一个进程 ,在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。处理器在这些线程上高速切换,让使用者感觉到这些线程在同时执行。

    一个java程序从main方法开始执行,然后按照既定的代码逻辑执行,看似没有其他线程参与,但实际上java程序天生就是多线程程序,因为执行main(0方法的是一个名称为main的线程,下面使用JMX来查看一个普通的java程序包含哪些线程,

  java并发编程基础

【1】main   //main线程,用户程序的入口

【2】 Reference Handler 清楚Reference线程

【3】Finalizer                  调用对象finalize方法的线程

【4】Signal Dispatcher   分发处理发送给JVM信号的线程

【5】Attach Listener 附加监听器线程

【6】Monitor Ctrl-Break 

可以看到,一个java程序的运行不仅仅是main()方法的运行,而是main线程和多个其他线程同时运行

  为什么要使用多线程

    执行一个hellWorld,却启动了那么多的“”“无关”线程,是不是把简单的问题复杂化了?当然不是,因为正确使用多线程,总是能够给开发人员代码显著的好处,而使用多线程的原因主要有以下几点。

  1、更多的处理器核心    2、更快得相应时间   3、更好的编程模型

  (1)、更多的处理器核心

    随着处理器上的核心数量越来越多,以及超线程技术的广泛应用,现在大多数计算机都比以往更加擅长并行计算,而处理器性能的提升方式,也从更高的主频向更多的核心发展。如何利用好处理器上的多个核心也成为了现在的主要问题

    线程是大多数操作系统调度的最小单元,一个程序作为一个进程来运行,程序运行过程中能够创建多个线程,而一个线程在一个时刻只能运行在一个处理器核心。试想一下,一个单线程程序的运行时只能使用一个处理器核心,那么再多的处理器核心也无法加入也无法显著提升该程序的执行效率。相反,如果该程序使用多线程技术,将计算逻辑分配到多个处理器核心上,就会显著减少程序的处理时间,并且随着更多处理器核心的加入而变的更有效率

  (2)更快的相应时间

    有时我们会编写一些较为复杂的代码(这里说复杂不是说复杂的算法,而是复杂的业务逻辑),例如,一笔订单的创建,它包括插入订单数据、生成订单快照、发送邮件通知卖家和记录货品销售数量等。用户从单击“”“订购”按钮开始,就要等待这些操作全部完成才能看到订购成功的结果。但是这么多业务操作,如何能够让其更快得完成呢?

  在上面的场景中,可以使用多线程技术,即将数据一致性不强的操作派发给其他线程处理(也可以使用消息队列),如生成订单快照、发送邮件等等。这样做的好处是响应用户请求的线程的线程能够尽可能快地处理完成,缩短响应时间,提升用户体验。

  (3) 更好的编程模型

    java为多线程t提供了良好、考究并且一致的编程模型,使开发人员能够更加专注于问题的解决,即为所遇到的问题建立合适的模型,而不是绞尽脑汁地考虑如何将其多线程化。一旦开发人员建立好了模型,稍微修改总是能够方便地映射到java提供的多线程编程模型上