javase——多线程

月佩半琪      2022-05-07     258

关键词:

线程是什么?

1、顺序执行与并行

2、继承Thread类

3、实现Runnable接口
4、并发问题

5、线程状态

6、线程停止

7、线程休眠sleep ()
8、线程礼让yield()

9、线程强制执行join ()
10、观察线程状态getState()

11、线程优先级setPriority(1), getPriority()
12、守护线程setDaemon(true)

13、线程同步
14、线程不安全三大案例

15、实现线程同步来实现线程安全
16、JUC (并发领域的一些编程)

17、死锁

18、锁Lock

19、线程通信

20、线程池ExeutorSeriefOExecutors

21、wait、sleep区别

22、实现Callable接口

线程是什么?

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中;

一个进程可以并发多个线程,每条线程并行执行不同的任务;

多线程程序设计的好处是提高了程序的执行吞吐率和执行效率。

多线程的常见应用场景

后台任务,:定时向大量用户推送信息例如广告部件,不胜其扰,大家定有体会

异步处理,例如:批量/O操作,发微博、记录日志等

分布式计算,共享稀有资源和平衡负载

web服务器本身,例如: Tomcat

  • Tomcat是一个服务器。我们将写好的服务端代码部署到Tomcat中进行工作,一个Tomcat服务器可以同时负载多个不同的项目的服务,每个服务又可以是多线程的。

1、顺序执行与并行

2、继承Thread类

3、实现Runnable接口

继承Thread类不建议使用,避兔oop局限性
实现Runnable接口推荐使用,避兔单继承局限性,方便同一个对象被多个线程使用

4、并发问题

4.1、如小明老师和黄牛党同时抢10张票,双方都可能抢到第6张票

4.2、顺序执行,并行,并发的比较例题

顺序执行:你吃饭吃到一半,电话来了,你-直到吃完了以后才去接,这就说明你不支持并发也不支持并行。

并发:你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。

----------》交替做不同事情的能力

并行:你吃饭吃到一半,电话来了,你-边打电话- -边吃饭,这说明你支持并行。此处注意理解:是同时吃,同时说,要真严格的说的话,需要2张嘴才是并行。

----------》同时做不同事情的能力

5、线程状态

6、线程停止

6.1、建议线程正常停止--- >利用次数,不建议死循环。

6.2、建议使用标志位--->设置一个标志位

6.3、不要使用stop或者destroy等过时或者jdk不建议使用的方法

7、线程休眠sleep ()

7.1、模拟倒计时

7.2、打印系统当前时间

7.3、每个对象都有-把锁,sleep不会释放锁

8、线程礼让yield()

礼让不一定成功,看CPU心情

  • 礼让成功时

  • 礼让不成功时

9、线程强制执行join ()

想像为vip插队的测试

10、观察线程状态getState()

getState()

11、线程优先级setPriority(1), getPriority()

先设置优先级再启动

12、守护线程setDaemon(true)

线程分为用户线程和守护线程,其它都为用户线程

虚拟机必须确保用户线程执行完毕,虚拟机不必确保守护线程执行完毕

如果JVM中没有一个正在运行的非守护线程,这个时候,JVM会退出。换句话说,守护线程拥有自动结束自己生命周期的特性,而非守护线程不具备这个特点。

通常来说,守护线程经常被用来执行一些后台任务,但是呢,你又希望在程序退出时,或者说JVM退出时,线程能够自动关闭,此时,守护线程是你的首选。

13、线程同步

队列+锁----------》有锁线程安全

14、线程不安全三大案例

14.1、三人共同买票超过了票的数量

14.2、两人取钱超过了钱的金额

14.3、ArrayList容器添加大量数据时(向容器中添加1000条数据只添加了998条)

15、实现线程同步来实现线程安全

synchronized每个对象对应一把锁,默认锁的是this,锁的对象就是变化的量(增删改的量)

15.1、使用同步方法

------------》方法中加关键字synchronized

15.2、使用同步代码块

-----------》放进代码块中synchronized(变化的量){}

16、JUC (并发领域的一些编程)

线程安全类型的一些类----------------------》例如:CopyOnWriteArrayList线程安全的集合

17、死锁

17.1、定义

多个线程互相抱着对方的资源,然后形成僵持

17.2、产生死锁的四个必要条件

1.互斥条件: 一个资源每次只能被一个进程使用。

2.请求与保持条件:一个 进程因请求资源而阻塞时,对已获得的资源保持不放。

3.不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

4.循环等待条件:若干进程之间形成-种头尾相接的循环等待资源关系。

上面列出了死锁的四个必要条件,我们只要想办法破其中的任意一个或多 个条件就可以避免死锁发生

17.3、就是同步时,想拿到另一个线程正在用着的资源时

18、锁Lock

从jdk5.0开始,ReentrantLock类实现了Lock

使用Lock锁,JVM将花费较少的时间来调度线程,性能更好。并且具有更好的扩展性(提供更多的子类)

◆优先使用顺序:

◆Lock >同步代码块(已经进入了方法体,分配了相应资源) >同步方法(在方法体之外)

synchronized与Lock的对比

1、Lock是显式锁(手动开启和关闭锁,别忘记关闭锁) synchronized是隐式锁, 出了 作用域自动释放

2、Lock只有代码块锁,synchronized有代码块锁和方法锁

19、线程通信

生成者消费者模式

  • 线程等待wait()/wait(指定等待的毫秒数)
  • 线程唤醒notify()/notfyAll()

测试:

  • 1.生产者消费者模型-->利用缓冲区解决:管程法(利用容器)

    • 生产者

    • 消费者

    • 缓冲区

    • 产品

    • 测试类

    • 结果

  • 信号灯法(利用标志位)

    • 生产者

    • 消费者

    • 产品

    • 测试

    • 结果

20、线程池ExeutorSeriefOExecutors

利用线程池创建线程

21、wait、sleep区别

21.1、来自不同的类

wait => Object
sleep => Thread

21.2、关于锁的释放

wait会释放锁。

sleep睡觉了,抱着锁睡觉,不会释放!

21.3、使用的范围是不同的

wait必须在同步代码块中
sleep可以再任何地方睡

21.4、是否需要捕获异常

wait不需要捕获异常
sleep必须要捕获异常

22、实现Callable接口(java.util.concurrent.Callable)

转载于狂神老师 ,本文仅作为笔记使用

javase-多线程

packagecom.btp.t4.多线程;/**单线程:一条线可以串起来的*/publicclassTestMain{publicstaticvoidmain(String[]args){method2("btp");}privatestaticvoidmethod2(Stringstr){//TODO自动生成的方法存根System.out.println("method2");method1( 查看详情

javase-09thread多线程(完整版)

JavaSE-09Thread多线程1.线程简介1.1普通方法调用和多线程1.2程序、进程、线程程序跑起来编程进程,进程里面分为若干个线程:例如main函数就是主线程(是系统入口,用于执行多个程序),gc垃圾回收机制也是一个线程多线程是模拟... 查看详情

javase---多线程---线程的控制

1、Java提供了一些工具方法,可以便捷控制线程的执行:   1.1  join          Thread提供了让一个线程等待另一个线程执行完成的方法:join;          当某个程序的执行流中调用其他线程的join方法... 查看详情

javase之多线程

今天打算重新学习一遍多线程,通过条理的的梳理,更加巩固基础知识。谈起多线程,我们需要分清楚一些概念,什么是程序、进程和线程?程序(program):是为了完成特定任务,用某种语言编写的一组指令的集合,指的是一... 查看详情

javase多线程012021.05.26-27

JavaSE多线程012021.05.26-27多花时间学习,提高效率,提高专注度加油!1Process与Thread进程与线程一个进程可以有多个线程,如视频中同时听声音,看图像,看弹幕等。程序是指令和数据的有序集合,是一个静态概念进程是执行程序... 查看详情

javase多线程下载的实现

本文中主要提供的是java多线程下载文件方案,以及java多线程将临时进度保存到文件,多线程断点续传的实现;1、多线程下载2、将下载进度保存到临时文件,多线程的断定续传1、多线程下载本例中首先在Tomcat服... 查看详情

javase-多线程(代码片段)

【线程池概念】  由于系统启动一个新线程的成本是比较高的,因为他涉及与操作系统的交互(这也就是为什么可以有百万个Goroutines,却只有几千个java线程)。在这种情形下,使用线程池可以很好地提高性能,尤其是当程序... 查看详情

012期javase面试题:多线程(代码片段)

...今天这篇是JavaSE系列的第十二篇,主要总结了Java中的多线程问题,多线程分为三篇来讲,这篇是第二篇,在后续,会沿着第一篇开篇的知识线路一直总结下去,做到日更!如果我能做到百日百更,希望你也可以跟着百日百刷,... 查看详情

javase知识-25(多线程(下))

25.01_多线程(单例设计模式)单例设计模式:保证类在内存中只有一个对象。如何保证类在内存中只有一个对象呢?(1)控制类的创建,不让其他类来创建本类的对象。private(2)在本类中定义一个本类的对象。Singletons;(3)提供公共的访... 查看详情

011期javase面试题:多线程(代码片段)

...今天这篇是JavaSE系列的第十一篇,主要总结了Java中的多线程问题,多线程分为三篇来讲,这篇是第一篇,在后续,会沿着第一篇开篇的知识线路一直总结下去,做到日更!如果我能做到百日百更,希望你也可以跟着百日百刷,... 查看详情

javase复习之——线程

线程其实就是程序执行的一条路径,一个进程中可以包含多条线程,多线程并发执行可以提高程序效率,可以同使完成多项任务多线程的应用场景迅雷多线程一起下载服务器同时处理多个客户请求多线程原理(单核CPU)在电脑上运... 查看详情

javase基础---多线程

...做时间片,时间片的时间可以非常短二:创建多线程  (1)继承Thread      1.线程不能重复启动,否则会报错, 查看详情

javase8基础多线程setdaemon守护线程

礼悟:          好好学习多思考,尊师重道存感恩。叶见寻根三返一,活水清源藏于零。          虚怀若谷良心主,皓月当空自在王。愿给最苦行无悔,诚... 查看详情

javase8基础多线程join线程加入

礼悟:          好好学习多思考,尊师重道存感恩。叶见寻根三返一,活水清源藏于零。          虚怀若谷良心主,皓月当空自在王。愿给最苦行无悔,诚... 查看详情

javase8基础多线程interrupt线程中断

礼悟:          好好学习多思考,尊师重道存感恩。叶见寻根三返一,活水清源藏于零。          虚怀若谷良心主,皓月当空自在王。愿给最苦行无悔,诚... 查看详情

013期javase面试题(十三):多线程(代码片段)

...今天这篇是JavaSE系列的第十三篇,主要总结了Java中的多线程问题,多线程分为三篇来讲,这篇是第三篇,在后续,会沿着第一篇开篇的知识线路一直总结下去,做到日更!如果我能做到百日百更,希望你也可以跟着百日百刷,... 查看详情

javase复习_10多线程复习

...不会释放锁voidshow(){Synchronized(this){wait()//可以同时有三个线程在此等待。 查看详情

24_javase_多线程

1.多线程简介首先,什么是多线程呢?我先举个现实生活中的例子给大家理解一下。假如现在有一个工厂,一开始的时候我只雇佣了一个员工,那么这个工厂的工作只能由这个单一的员工来操作,那么这个员工... 查看详情