博客
关于我
JAVA多线程基础
阅读量:563 次
发布时间:2019-03-09

本文共 1766 字,大约阅读时间需要 5 分钟。

JAVA多线程基础

1. 并发原理

多线程允许我们“同时”执行多段代码。线程是并发运行的,线程调度会统一规划CPU时间,将CPU的时间划分为若干片段,然后尽可能的均匀分配给所要并发运行的线程。每个线程在获取CPU时间片段后,CPU就会运行它的任务,当时间片段用完后,CPU会离开并执行获取到CPU时间片的线程。这种微观上走走停停,在宏观上感觉是同步进行的现象称为“并发运行”。


2. 创建线程 Thread

2.1 继承 Thread 并重写 run 方法

这种方式有两个不足之处:

  • 由于 Java 是单继承,这就倒置若继承了 Thread 就不能在继承其他的类,在实际开发中并不方便,因为无法重用其他类的某些方法。
  • 继承 Thread 后重写 run 方法定义线程要执行的任务,这就导致了线程与线程执行任务有一个必然的耦合关系,不利于线程的重用。
  • 2.2 实现 Runnable 接口单独定义线程任务

    这种方式的优势在于线程和线程要执行任务分离,降低耦合度。

    2.3 使用匿名内部类实现创建线程的两种方式

    无论是通过匿名内部类直接定义线程任务,还是单独定义 Runnable 接口并传入 Thread 中,都能有效减少线程与任务的耦合度。


    3. currentThread()

    线程提供了 static Thread currentThread(),该方法可以获取运行这个方法的线程。在 Java 中,所有的代码都是线程运行的,main 方法也不例外。JVM 启动后会启动一个线程来执行 main 方法,通常我们称执行 main 方法的线程为“主线程”。


    4. 线程的优先级

    4.1 线程优先级

    线程的优先级可以影响它获取 CPU 时间片段的概率。线程优先级有 10 个等级(1-10),其中 1 代表优先级最低,5 代表默认,10 代表优先级最高。

    4.2 设置优先级

    可以通过调用 Thread.setPriority(int p) 方法设置线程优先级。

    4.3 示例

    通过设置优先级可以观察到线程执行顺序的差异。通常情况下,优先级高的线程会先执行完任务。


    5. 睡眠阻塞状态

    5.1 sleep 方法

    sleep 方法可以让线程进入阻塞状态,指定阻塞的时间。线程在睡眠期间不会占用 CPU 时间片段,只会等待 CPU 分配新的时间片。

    5.2 中断机制

    如果在 sleep 方法阻塞的状态中被其他线程调用 interrupt 方法,线程会抛出 InterruptedException 异常并恢复到 runnable 状态。

    5.3 实现小品事件

    通过 sleep 方法可以模拟线程之间的等待时间,例如模拟两个线程之间的对话。

    5.4 实现图片切换

    通过 sleep 方法可以实现面板背景色来回切换的效果。


    6. join 方法

    6.1 概念

    join 方法允许一个线程在另一个线程上等待,直到目标线程完成后再继续执行。

    6.2 模拟图片下载

    通过 join 方法可以实现线程间的同步运行,确保下载任务完成后再显示图片。


    7. 守护线程

    7.1 守护线程特性

    守护线程(后台线程)可以通过 setDaemon(boolean b) 方法设置。默认情况下,线程不是守护线程。

    7.2 守护线程的优点

    守护线程在进程结束时会被强制终止,这在某些资源管理场景中非常有用。

    7.3 示例

    通过设置 jack 为守护线程,可以观察到线程终止时的行为。


    8. 线程池

    8.1 线程池的作用

    线程池可以有效管理多线程数量,避免资源浪费,提高程序效率。

    8.2 创建线程池

    通过 Executors.newFixedThreadPool(2) 创建一个固定线程池,适用于需要多个线程同时执行任务的场景。

    8.3 线程池的关闭

    调用 shutdown() 方法可以关闭线程池,同时确保已提交的任务继续执行。


    9. 查看线程信息

    9.1 获取线程信息

    可以通过 Thread 类提供的方法获取线程的详细信息,例如线程 ID、线程名称、优先级、是否为守护线程等。

    9.2 示例

    通过 main 方法获取线程信息,可以更好地理解线程的运行状态。


    通过以上内容,可以全面了解 Java 中的多线程基础,包括线程的创建、管理、调度以及线程池等高级主题。

    转载地址:http://zgopz.baihongyu.com/

    你可能感兴趣的文章
    Python 多处理 Numpy 随机
    查看>>
    Python 多处理 >= 125 列表永远不会完成
    查看>>
    Python 多处理:在第一个子错误时中止映射
    查看>>
    Python 多处理不断产生 pythonw.exe 进程而不做任何实际工作
    查看>>
    Python 多处理从不加入
    查看>>
    Python 多处理如何优雅地退出?
    查看>>
    Python 多处理将子进程的标准输出重定向到 Tkinter 文本
    查看>>
    Python 多处理库错误(AttributeError:__exit__)
    查看>>
    Python 多处理模块的 .join() 方法到底在做什么?
    查看>>
    python 多线程与GIL
    查看>>
    python 多进程-基础
    查看>>
    python 多进程-进阶-进程池
    查看>>
    python 多进程-进阶-进程间通信之Pipe
    查看>>
    python 多进程-进阶-进程间通信之Queue
    查看>>
    python 如何“否定“value : 如果为真则返回假,如果为假则返回真
    查看>>
    Python 如何在 Web 环境中使用 Matplotlib 进行数据可视化
    查看>>
    python 如何把字符串转换成浮点数
    查看>>
    python 如果文件夹不存在就创建文件夹
    查看>>
    Python 如果有很多或以收缩形式
    查看>>
    Python 子进程 Popen 与 Pyinstaller
    查看>>