栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java笔记9:第8章 多线程编程

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java笔记9:第8章 多线程编程

第8章 多线程编程

课程链接:https://www.xuetangx.com/course/ncepu08091004439/8910836?channel=i.area.learn_title

文章目录
  • 第8章 多线程编程
    • 8.1 多线程简介
    • 8.2 创建线程的方式
      • 线程创建的两种方法
      • Thread类与Runnable接口的联系
    • 8.3 线程控制
      • 控制线程
      • 线程控制的基本方法
        • 1.sleep方法
        • 2.interrupt方法
        • 3.join方法
        • 4.线程终止方法
    • 8.4 线程的同步机制
      • 同步的概念
      • sychronized关键字
    • 8.5 线程间的通信
      • 等待/唤醒机制
        • 1.wait方法
        • 2.notify方法
      • 生产者/消费者问题
    • 8.6 Callable接口
      • java.util.concurrent包(J.U.C并发包)简介
      • Callable接口
        • FutureTask类
      • 异步处理
    • 8.7 volatile关键字

8.1 多线程简介



一个进程可以拥有多个线程,这些线程可以共享为进程分配到内存和其他资源
进程之间不允许直接进行相互访问,智能通过系统提供的通信机制进行交互





定时等待与等待的区别:定时等待状态只要到了最大等待时间,即使等待的条件仍未满足,线程还是会自动醒来,自行返回

8.2 创建线程的方式 线程创建的两种方法


方法一:继承Thread类


方法二:实现Runnable接口




Thread类与Runnable接口的联系




用继承Thread类的方法,Ticket类每个对象都有自己的Tickets成员,每个对象都有自己的10张票,每个线程都卖的是自己的拥有的10张票,所以实际上总共卖了30张票

因为只创建了一个BookTickets实例,因此Tickets成员也就是演出票只有一份
因此,实现Runnable接口的方式,可以满足多个线程处理统一数据资源的情况

8.3 线程控制 控制线程


线程控制的基本方法


1.sleep方法



sleep方法在此例中的作用:确定标签文本的刷新频率;在其休眠期间释放CPU资源

2.interrupt方法


3.join方法



主线程的i大于1时,只能等待子线程全部执行完毕才能执行剩下的部分

4.线程终止方法



8.4 线程的同步机制


增加休眠代码模拟现实情况,程序执行结果出现错误

同步的概念



一个临界资源可以对应多个临界区。





多个线程并发访问同一数据资源时需要进行同步处理

sychronized关键字

Java中,实现同步的方式有同步代码块及同步方法,使用synchronized关键字实现。





同步是以系统开销为代价的,因此同步控制并非越多越好,一方面,要避免无谓的同步控制,另一方面,要尽可能降低锁的粒度,仅对必要的代码块或者是需要保护的资源本身加锁。

8.5 线程间的通信 等待/唤醒机制


1.wait方法

wait和sleep方法都能使线程进入线程的限时等待状态,但wait方法在释放CPU资源的同时也交出了临界资源的控制权,而sleep方法却一直占用着资源,当wait()方法被调用时,当前线程会释放所持有的锁资源,但是一个线程获得了锁,即使调用sleep()方法进入休眠,也不会释放锁。

调用obj对象的wait方法的前提是,必须获得该对象的对象锁,因此wait方法必须写在sychronized修饰的代码段内,wait方法常见的场景是,当临界资源的状态不满足特定条件时,调用该对象的wait方法,通常使用循环模式调用wait方法

2.notify方法

生产者/消费者问题


产品(面包)


缓冲区(面包店)

生产者类(生产面包)

消费者类(消费面包)

8.6 Callable接口 java.util.concurrent包(J.U.C并发包)简介

并发编程中使用的工具包

Callable接口

run方法没有返回值,要获取现线程的实现结果,就可以通过Callable接口实现

FutureTask类


get( )方法可以获得call( )的执行值,如果在获取时任务并没有执行完,当前线程就会被阻塞,知道线程执行完毕,然后才能获取结果。
Runnable和Callable都采用Thread.start()启动线程






异步处理

8.7 volatile关键字






用volatile修饰的变量,每次更新对其他线程都是立即可见的。


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/679086.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号