思维导图04----Java多线程基础

本文详细介绍了Java多线程的基础知识,包括线程的创建与使用、JDK5新增的线程创建方式、线程同步、异常处理、线程通信、线程生命周期以及各种锁机制。通过思维导图的形式,清晰展示了多线程的相关概念和技术,如Runnable和Callable接口、线程池、同步方法和Lock接口等,旨在帮助读者深入理解Java多线程编程。
摘要由CSDN通过智能技术生成

Java多线程基础----思维导图

下载地址: https://download.csdn.net/download/q863672107/20016460


在这里插入图片描述


以下是自动转换的MakeDown文本


多线程

单核CPU执行任务时, 单线程的执行速度比多线程(线程切换)更快
一个Java进程至少有三个线程: main, GC, 异常处理
多线程的优点:
1.提高应用程序的响应。对图形化界面更有意义, 可增强用户体验(同时执行多个任务)。
2.提高计算机系统CPU的利用率, 减少CPU空闲。
3.改善程序结构, 将既长又复杂的进程分为多个线程, 独立运行, 利于理解和修改。
何时需要多线程:
程序需要同时还行多个任务
程序需要实现一些需要等待的任务时, 如用户输入, 文件读写, 网络操作, 搜索等。
需要一些后台运行的程序时。

线程的创建和使用

创建

在开发中, 优先选择实现接口的方式

1.单继承的局限性
2.继承的方式导致多线程需要创建多个子类对象, 多线程共享的属性需要手动声明为static, 而继承Runnable接口可以通过同一个实现类对象创建多个Thread对象, 可以天然地实现属性共享。

联系:
Thread类本身实现了Runnable接口, 继承Thread类间接实现了Runnable接口
两者都要重写run方法, 将多线程运行逻辑写到run方法中

  • 继承Thread类

    • 创建Thread类的子类对象(重写run方法)
  • 实现Runnable接口

      1. 创建Runnable接口的实现类对象(实现run方法), 并传入Thread类构造器
    • 2.创建Thread类对象(start()后实际调用实现类对象的run方法)

使用

  • 启动多线程

    • 启动方式一

      • 创建继承/实现类
      • 重写run()方法
      • start()方法启动线程
    • 启动方式二

  • 常用方法

    • 线程设置

      • String getName()
      • void setName(String neme)
      • static Thread currentThread()
    • 线程通信

      • void join()

        • 线程插队

          在线程a中调用线程b的join()方法, 此时线程a就进入阻塞状态, 直到线程b执行完以后, 线程a才结束阻塞状态。

      • static void yield()

        • 线程让步

          释放当前cpu时间片
          实际有可能释放后又获取到时间片, 继续执行当前线程

      • static void sleep(long millis)

        • 线程睡眠

          当前线程睡眠指定的millis毫秒数
          在指定的毫秒时间内, 当前线程是TIMED_WAITING状态, 不会释放锁和cpu资源

      • void stop()

        • 强制结束线程生命周期
      • boolean isAlive()

        • 判断线程是否活着
    • Object类的方法
      锁机制下使用

      • wait()
      • notify()
      • notifyAll()

JDK5 新增线程创建方式

实现Callable接口

相比于Runnable Callable的功能更强大些
相比于run方法, call可以有返回值
方法可以跑出异常
支持泛型的返回值
需要借助FutureTask类, 比如获取返回结果

  • 启动方式一

    • Future接口

      可以对具体Runnable, Callable任务的执行结果进行取消, 查询是否完成, 获取结果等。
      结果只能在计算完成时使用方法get进行检索,必要时阻塞。 cancel方法执行取消操作。 提供了其他方法来确定任务是正常完成还是被取消。 一旦计算完成,就不能取消计算。

      如果只是为了可取消而使用Future,而不需要返回结果,可以声明Future<?>,并return null作为底层任务的结果。

      FutureTask是Future接口的唯一实现类
      FutureTask 同时实现了Runnable, Future接口。它既可以作为Runnable被线程执行, 又可以作为Future得到Callable的返回值。

    • FutureTask类

      • 1.创建一个Callable接口实现类
        实现call()方法,可以有返回值,抛出异常

      • 2.用FutureTask对Callable对象进行包装
        (通过Callable对象创建FutureTask对象)

      • 3.用Thread包装FutureTask对象, 并启动线程

        • 多个线程,需要通过Thread包装
          多个FuturteTask对象

          CallableImpl callableImpl = new CallableImpl();
          //FutureTask对象,还有Callable接口,通过泛型限定,否则call,get方法默认返回Object类型
          FutureTask futureTask1 = new FutureTask<>(callableImpl);
          FutureTask futureTask2 = new FutureTask<>(callableImpl);
          //多线程start还是通过Thread类实现
          new Thread(futureTask1, “线程1”).start();
          //通过一个FutureTask只能创建一个线程
          new Thread(futureTask2, “线程2”).start();

        • 4.调用FutureTask的get()方法获取返回值
      • 代码

        /**

        • @author chenyao

        • @version v1.0

        • @desc

        • @create 2021/6/27 21:30
          */
          public class CallableTest implements Callable

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

code tea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值