• Java多线程小总结


    多线程

    线程与进程

    线程:具有完成特定任务的一条执行路径,是CPU执行的最小单位

    进程:正在执行的程序

    重点:CPU在某个时间刻度上只能够执行一条原子性语句 字节最小是bit位

    原子性语句:不能够再次分割的语句。

    CPU执行原理

      1. 除了多核处理器,本质上CPU在某一个时间点上执行了一条线程

      2. CPU看起来像是同时运行,实际上一次只能执行一个线程的一条原子性语句,之所以看起来同时运行,就是因为处理速度非常快。

      3. 在java的线程程序中,采用的是抢占式调度模型

      4. 并发与并行的区别

    并发:同一个时间段同时执行

    并行:在同一时刻上同时执行,物理上的同时执行。

          5.同步与异步的区别

    同步:本质就是串行执行,并发情况下会出现同步问题。

    异步:能够在处理一个任务的同时还能够处理其他事情。

                 6.一个进程包含多个线程,一个java进程至少包括了主线程、垃圾回收线程

    Thread类

    自定义类继承Thread类,重写Thread类里面的run()方法。创建线程对象,启动线程。

    启动线程的是start()方法,不是run()方法。一下简单说说开启线程的方式。

      1. 实现Runnable接口方式开启线程

    避免Java单继承带来的局限性

    适合多个相同程序的代码区处理同一个资源的情况,比如:多个线程实现分割复制视频。

    自定义类实现Runnable接口重写run()方法,并把自定义类作为构造参数传给Thread,进而调用thread.start()方法启动线程

    好处:有效的数据分离,可以使用多个线程处理一个数据。

         2.实现Callable方式开启线程

    需要依赖FutureTask类

    FutureTask类对接接口RunnableFuture,RunnableFuture接口继承了Runnable、Future接口。所以Callable本质上还是使用了Runnable接口的实例来开启线程。不同的是Callable类可以产生值返回,但是使用get()获取值会堵塞线程。

         3.匿名内部类开启线程

    没啥好说的就是匿名创建了Thread对象,并开启线程。也可以匿名创建Runnable子类并给Thread调用开启线程,不过两种方式一起使用,优先使用Thread的子类。

    设置获取线程的名称

    1.通过构造方法

    Thread(String name)       创建一个名叫name的线程

    Thread(Runnable target,String name)

    2.通过线程的成员方法

    setName(String name)

    getName()

    3.通过静态方法

    threa.currentThread().getName();获取主线程的名称

    getId();获取线程的ID,long类型

    线程的优先级

    java使用的是抢占式调度模型,优先级高的线程会优先使用CPU,同级别的优先级,则是随机选择,优先级高的获取CPU的时间相对要多一些。

    设置获取优先级:

    public final int getPriority()    获取线程的优先级

    public final void setPriority(int newPriority) 设置线程的优先级

    线程的优先级:1~10,10个级别,数值越高优先级越高。系统的优先级,基本上我们无法控制,我们所设置的优先级,只是局部的程序。

    线程休眠

    Thread.sleep(1000);        阻塞正在执行的线程1秒

    线程中断

    public final void stop():停止线程,直接终止线程,不会再执行。

    public void interrupt();    给子线程抛出一个异常,子线程还可以继续执行。

    后台线程

    一般来说JVM中会包括两种线程:用户线程、后台线程

    后台线程:在程序运行的时候在后台提供的一种通用的服务线程,并且这种线程,并不是程序的必要部分。

    当用户线程结束时,会终结所有的后台线程。

    比如:程序中主线程结束了,其他子线程也会被强制结束。

    线程加入

    public final void join();    t1.join:优先让t1线程执行结束。

    线程礼让

    public static void yield() 使线程让出CPU的执行权,然后和其他线程一起再来抢这个执行权。

  • 相关阅读:
    将Moba的输出导出为文件
    MyBatis入参为0时失效问题
    (笔记)交大电院MEM提前面试优秀经验分享【附面试流程及规则】
    (笔记)GPIO基本原理与寄存器配置(STM32篇)
    (笔记)高速电路板完美走线的诀窍
    使用 python 收集 kubernetes events 并写入 elasticsearch
    java使用io.kubernetes.client-java调用k8s api创建pod/service/ingress示例
    中英文逗号空格分隔符正则式
    SpringCloud学习一-搭建netflix-eureka微服务集群
    Spring 中经典的 9 种设计模式,打死也要记住啊!
  • 原文地址:https://www.cnblogs.com/xj619/p/10719543.html
Copyright © 2020-2023  润新知