一、基本概念理解:
1.1、进程和线程的理解
1.2、同步和异步的理解(阻塞模式和非阻塞模式)
1.3 线程间共享变量和不共享变量
二、多线程的实现方式和构造方法:
2.1 实现方式:2个
2.2 构造方法:8个
三、线程的常用方法
3.1 start()方法
3.2 run()方法:让线程运行
3.3 sleep()方法:让线程休眠
3.4 suspend()方法和resume()方法:让线程暂停与恢复
3.5 .stop()方法:让线程停止(已废弃+不建议)
3.6 interrupt()方法:让线程停止(给线程打上停止标记)
注意:如何让线程停止
3.7 interrupted()方法 和 isInterrupted()方法
3.8 yield()方法:
四、线程安全和synchronized关键字
4.1 非线程安全产生的原因:
4.2 synchronized关键字的作用(解决线程安全问题)
五、Thread.currentThread()和this的区别:
六、线程的优先级:
七、END!

一、基本概念理解:

1.1、进程和线程的理解

进程:是受操作系统管理的基本运行单元。

线程:理解为在进程中独立运行的子任务。

注:Windows系统是多任务(进程)操作系统的。

1.2、同步和异步的理解(阻塞模式和非阻塞模式)

  • 同步是阻塞模式,异步是非阻塞模式。

  • 多线程是异步的。

我的理解:

同步是指两个线程的运行相关的,一个线程要阻塞等待另一个线程运行结束。

异步的意思是两个线程毫无相关,自己运行自己的。

1.3 线程间共享变量和不共享变量

不共享:每次新建一个线程对象即可,默认是不共享的。

共享:在创建需共享变量的多个线程时,传入同一个Runnable 对象,那么新建的线程将执行传入的Runnable 对象的run()方法。具体即为让一个线程执行另一个线程的run()方法。

二、多线程的实现方式和构造方法:

2.1 实现方式:2个

  • 继承Thread类(JAVA单继承,有局限)
  • 实现Runnable接口(建议使用)

2.2 构造方法:8个

其中两个可以接受一个 Runnable 对象,即可以把一个Runnable 对象(线程)当做入参传递给另一个线程。

这样,可以让一个线程执行另一个线程的run()方法。这样,执行对应run方法的线程就确定了(传入的线程)。

三、线程的常用方法

3.1 start()方法

start()方法:通知“线程规划器”此线程(相关信息和数据)已经准备就绪,等待调用线程对象的run()方法。具体何时调用,全部由系统管理。(执行的线程是系统的新线程,非当前线程)

3.2 run()方法:让线程运行

run()方法:可以直接让系统执行线程对象的run()方法(执行的线程是当前线程)

否则,只是调用start()方法即可,具体执行由新线程执行。

3.3 sleep()方法:让线程休眠

让当前正在执行的线程休眠一段时间;

3.4 suspend()方法和resume()方法:让线程暂停与恢复

  1. suspend()方法停止,resume()方法恢复。

    不足:

    1. 会独占对象(即不释放锁),其他线程无法访问公共同步对象
    2. 不同步:即当前线程暂停,其他线程继续执行。导致数据不同步。

3.5 .stop()方法:让线程停止(已废弃+不建议)

可以使用Thread.stop()方法,但不建议,因为这个方法不是安全的,并且已被废弃。

建议使用:interrupt()方法(该方法不会终止一个正在运行的线程,需加入一个判断才可终止线程)

3.6 interrupt()方法:让线程停止(给线程打上停止标记)

并不是真的立即停止,只是在线程上打了一个停止的标记。具体什么时候停止,还需实际情况观察。(与start方法和run()方法的作用挺像)

注意:如何让线程停止

  1. 可以使用异常停止线程(比较建议的方法
  2. 在沉睡中停止:先sleep()然后interrupt()。也可以先interrupt()后sleep()
  3. 暴力停止:使用stop() (不建议使用,因为会解锁,同时一些清理工作没有完成。会造成数据异常
  4. interrupt()加上return。
  5. 线程正常退出;

注意,停止线程的问题在于线程停止后,不要执行其他代码,所以只要符合这个原则,实际实现可以自己设置。

3.7 interrupted()方法 和 isInterrupted()方法

interrupted()方法:测试当前线程(当前线程)是否已经是中断状态,执行后会将状态标志置清除为false;

isInterrupted()方法:测试线程Thread对象(调用该方法的线程对象所对应的线程,不一定是当前线程。例如在A线程中调用B线程对象的isInterrupted方法 )是否已经是中断状态,不清除状态标志;

参考: interrupt、interrupted 、isInterrupted 区别 - CSDN博客 https://blog.csdn.net/z69183787/article/details/25076033

3.8 yield()方法:

放弃当前的CPU资源,将它让给其他任务去占用CPU执行时间。

四、线程安全和synchronized关键字

4.1 非线程安全产生的原因:

  1. 线程A执行了一部分,然后暂停(线程A会保存当前执行环境);
  2. 此时线程B执行同样的部分,执行结束(线程B在线程A暂停时,修改了共用的数据。)
  3. 线程A继续执行(线程A以为还是原来的数据,继续执行。但数据已被线程B修改过。这就出现了线程不安全)

4.2 synchronized关键字的作用(解决线程安全问题)

synchronized可在任意对象及方法上加锁。当多个线程执行到该部分代码时,以排队方式进行处理。先判断要执行部分是否被加锁,如果被加锁,表明其他线程正在执行,需等其他线程执行完之后(即解锁),才能自己执行。

五、Thread.currentThread()和this的区别:

参考:Thread.currentThread()与this的区别 - CSDN博客 https://blog.csdn.net/qw222pzx/article/details/79353046

深入了解:可参考对于<对于start()方法和run()方法>这一部分的笔记

六、线程的优先级:

  1. 继承性:如A线程启动B线程,则B线程的优先级和A线程一样;
  2. 规则性:高优先级的线程总是大部分先执行完;(同时,当优先级差别很大时,线程的执行顺序与调用顺序无关)
  3. 随机性:优先级高的线程不一定每一次都先执行完;

七、END!

《JAVA多线程编程核心技术》 笔记:第一章的更多相关文章

  1. Java多线程编程核心技术,第一章

    1,Java并发--详解this与Thread.currentThread()的区别:https://blog.csdn.net/championhengyi/article/details/7666 ...

  2. Java多线程编程核心技术-第1章-Java多线程技能-读书笔记

    第 1 章 Java 多线程技能 本章主要内容 线程的启动 如何使线程暂停 如何使线程停止 线程的优先级 线程安全相关的问题 1.1 进程和多线程的概念及线程的优点 进程是操作系统结构的基础:是一次程 ...

  3. Java多线程编程核心技术-第4章-Lock的使用-读书笔记

    第 4 章 Lock 的使用 本章主要内容 ReentrantLocal 类的使用. ReentrantReadWriteLock 类的使用. 4.1 使用 ReentrantLock 类 在 Jav ...

  4. java多线程编程核心技术-笔记

    一.第一章 1.自定义线程类中实例变量针对其他线程有共享和不共享之分,自定义线程中的变量,如果是继承自thread类,则每个线程中的示例变量的更改,不影响其他线程2.当多个线程去访问一个局部变量是会产 ...

  5. Java多线程编程核心技术-第7章-拾遗增补-读书笔记

    第 7 章 拾遗增补 本章主要内容 线程组的使用. 如何切换线程状态. SimpleDataFormat 类与多线程的解决办法. 如何处理线程的异常. 7.1 线程的状态 线程对象在不同的运行时期有不 ...

  6. Java多线程编程核心技术-第5章-定时器 Timer-读书笔记

    第 5 章 定时器 Timer 定时 / 计划功能在移动开发领域使用较多,比如 Android 技术.定时计划任务功能在 Java 中主要使用的就是 Timer 对象,他在内部使用多线程的方式进行处理 ...

  7. Java多线程编程核心技术-第3章-线程间通信-读书笔记

    第 3 章 线程间通信 线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大 ...

  8. Java多线程编程核心技术-第2章-对象及变量的并发访问-读书笔记

    第 2 章 对象及变量的并发访问 本章主要内容 synchronized 对象监视器为 Object 时的使用. synchronized 对象监视器为 Class 时的使用. 非线程安全是如何出现的 ...

  9. Java多线程编程核心技术-第6章-单例模式与多线程-读书笔记

    第 6 章 单例模式与多线程 本章主要内容 如何使单例模式遇到多线程是安全的.正确的. 6.1 立即加载 / “饿汉模式” 什么是立即加载?立即加载就是使用类的时候已经将对象创建完毕,常见的实现办法就 ...

  10. java多线程编程核心技术——第三章

    第一节等待/通知机制 1.1不使用等待/通知机制实现线程间的通讯 1.2什么是等待/通知机制 1.3等待/通知机制的实现 1.4方法wait()锁释放与notify()锁不释放 1.5当interru ...

随机推荐

  1. C#设计模式学习笔记-单例模式随笔

    最近学习 设计模式,从单例模式入手 啥是单例模式: 要实现一个单例类的话,首先,肯定是不能让用户自行生产的,那就是说明不能让用户new,所以,就必须把构造函数设置成为私有的 因为静态变量的生命周期跟整 ...

  2. jqgrid 加按钮列

    1.在jqgrid表格中增加列,内容是图标,定义图标单击事件,可以操作这一行的数据,如下图 2.前台代码 <div id="grid_List"> <table ...

  3. 自己动手写CPU之第五阶段(2)——OpenMIPS对数据相关问题的解决措施

    将陆续上传本人写的新书<自己动手写CPU>(尚未出版).今天是第16篇.我尽量每周四篇 5.2 OpenMIPS对数据相关问题的解决措施 OpenMIPS处理器採用数据前推的方法来解决流水 ...

  4. FreeSWITCH技巧:notify与message-waiting

    FreeSWITCH技巧:notify与message-waiting @(Freeswitch经验点滴) 现象描述 在客户端登陆抓包时,发现了FreeSWITCH发来的包: NOTIFY sip:9 ...

  5. SpringCloud系列十七:Hystrix的监控

    1. 回顾 上文讲解了使用Hystrix为Feign添加回退,并通过Fallback Factory检查回退原因以及如何为Feign客户端禁用Hystrix. 2. Hystrix的监控 除实现容错外 ...

  6. MySQL怎样存储IP地址

    为什么要问如何存储IP 首先就来阐明一下部分人得反问:为什么要问IP得怎样存,直接varchar类型不就得了吗? 其实做任何程序设计都要在功能实现的基础上最大限度的优化性能.而数据库设计是程序设计中不 ...

  7. 运行百度语音识别官方iOS demo,无法离线识别解决办法

    需对demo进行如下修改: 1,我下载了一个临时授权文件temp_license_2015-10-27,把它拖到xcode工程里. 2,然后在BDVRViewController.m中的loadOff ...

  8. scut客户端心跳超时和客户端断开测试

    1.断开的消息触发后,依然会触发超时 2.触发超时不会触发断开 3.超时会触发多次,断开只触发一次 超时不是很准确,好像有时候不会触发.如果要判断玩家是否下线,可以用最后一次心跳时间判断

  9. atitit.提升兼容性最佳实践 p825.doc

    atitit.提升兼容性最佳实践 p825.doc 1. Atitit.兼容性的“一加三”策略1 2. 扩展表模式2 3. 同时运行模式2 3.1. 完美的后向兼容性3 3.2. 虚拟机模式3 3.3 ...

  10. linux学习笔记31--命令route和routetrace

    Linux系统的route命令用于显示和操作IP路由表(show / manipulate the IP routing table).要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或 ...