博客
关于我
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/

    你可能感兴趣的文章
    multiprocessing.Manager 嵌套共享对象不适用于队列
    查看>>
    multiprocessing.pool.map 和带有两个参数的函数
    查看>>
    MYSQL CONCAT函数
    查看>>
    multiprocessing.Pool:map_async 和 imap 有什么区别?
    查看>>
    MySQL Connector/Net 句柄泄露
    查看>>
    multiprocessor(中)
    查看>>
    mysql CPU使用率过高的一次处理经历
    查看>>
    Multisim中555定时器使用技巧
    查看>>
    MySQL CRUD 数据表基础操作实战
    查看>>
    multisim变压器反馈式_穿过隔离栅供电:认识隔离式直流/ 直流偏置电源
    查看>>
    mysql csv import meets charset
    查看>>
    multivariate_normal TypeError: ufunc ‘add‘ output (typecode ‘O‘) could not be coerced to provided……
    查看>>
    MySQL DBA 数据库优化策略
    查看>>
    multi_index_container
    查看>>
    MySQL DBA 进阶知识详解
    查看>>
    Mura CMS processAsyncObject SQL注入漏洞复现(CVE-2024-32640)
    查看>>
    Mysql DBA 高级运维学习之路-DQL语句之select知识讲解
    查看>>
    mysql deadlock found when trying to get lock暴力解决
    查看>>
    MuseTalk如何生成高质量视频(使用技巧)
    查看>>
    mutiplemap 总结
    查看>>