美文网首页Java并发编程java
Java并发编程基础-线程简介

Java并发编程基础-线程简介

作者: markfork | 来源:发表于2018-05-14 20:39 被阅读5次

    章节目录

    • 1.线程定义
    • 2.使用多线程的优势
    • 3.线程优先级
    • 4.线程的状态
    • 5.Daemon 线程

    1.线程定义

    进程与线程的区别

    1.进程是cpu进行资源分配的独立单位,指的是程序在数据集合上的一次运行过程。
    2.线程是cpu 进行调度的最小单位,在一个进程中会创建多个线程。
    

    线程拥有的独立资源

    栈中数据是线程独享的,包括局部变量、程序计数器等
    堆中数据是线程共享的,如线程同时操作堆中某对象的某属性。
    

    Java程序运行的实质

    一个程序的运行不仅仅是main()方法的运行,而是main线程和多个其他线程共同运行
    

    2.使用多线程的优势

    1.充分利用更多的处理核心
    2.更快的响应时间

       例如,一笔订单的创建,它包括插入订单数据,生成订单快照,发送邮件通
    知买家和记录货品销售数量等, 用户从单击“订购按钮" 开始,就要等待这些操
    作全部完成才能看到订购成功的结果,但是这么多的业务操作,如何才能够跟快的完成?
       在上面的场景中,我们可以使用多线程技术,即将数据一致性不强的操作派发
    给其他线程处理,好处是响应用户请求的线程能更快的处理完成,缩短了响应时间,提升了用户体验。
    

    3.线程优先级

    thread.setPriority(10),线程优先级从1-10顺序排列

    4.线程的状态

    Java线程在运行的声明周期中可能处于如下表所示的6中状态,在给定的一个时刻,线程只能处于其中一个状态。

    状态名称 说明
    new 初始状态,线程被构建,但是还没有调用start()方法
    runnable 运行状态,Java线程将操作系统中的就绪运行两种状态统称为"运行中"
    block 阻塞状态,表示线程等待资源可用,如i/o 或者阻塞于锁
    waiting 等待状态,表示线程进入等待状态,进入该状态表示当前线程需要等待其他线程做出一些特定动作(通知或中断)
    time_waiting 超时等待状态,该状态不同于waiting,它是可以在指定的时间自行返回的
    terminated 终止状态,表示当前线程执行完毕

    如下图所示,为java线程状态变迁图:

    java线程状态变迁图

    1.线程创建之后,调用start()方法,状态变更为可运行状态,待资源准备就绪后,开始运行。
    2.线程执行 lockObject.wait() 方法,线程进入等待状态。
    3.进入等待状态的线程依靠其他线程的通知才能返回到运行状态。
    4.超时等待相当于在等待状态基础上增加超时限制,超时时间到达会自动返回到运行状态。
    5.线程调用同步方法,在没有获取锁的情况下,线程会进入到阻塞状态。
    6.线程在执行Runable 的run()方法后,进入终止状态。

    Daemon线程
    支持性线程,被用作程序中后台调度以及支持性工作。
    当一个Java虚拟机中不存在非Daemon线程时,JVM将退出。
    可以通过调用Thread.setDaemon(true)将线程设置为Daemon线程。
    Daemon属性需要在启动线程前执行,不能在启动线程之后启动。

    注意:Daemon线程被用作完成支持性工作,但在Java虚拟机退出时,Daemon线程中的finally不一定会执行。
    如下代码所示:

    public class Daemon {
      
        static class DaemonRunner implements Runnable {
            public void run(){
                try{
                    TimeUnit.Second.sleep(10);//沉睡10s
                }finally{
                    System.out.println("Daemon thread finally run");//执行类似资源回收动作
                }
            }   
        }
    }
    

    当JVM中已经没有非Daemon线程,虚拟机就要退出。JVM中所有Daemon线程需要立即终止,因此finally块并没有执行。

    相关文章

      网友评论

        本文标题:Java并发编程基础-线程简介

        本文链接:https://www.haomeiwen.com/subject/gvawrftx.html