| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> PHP知识库 -> Java多线程1---线程基础:创建线程三种方式、线程的生命周期、线程通信等 -> 正文阅读 |
|
[PHP知识库]Java多线程1---线程基础:创建线程三种方式、线程的生命周期、线程通信等 |
一、线程理论1、线程和进程(1)进程----一个应用程序(软件--QQ)----进程间内存不共享 ? ? ? ??线程----进程中的一个执行场景(和不同人聊天)----线程间栈内存和程序计数器不共享,堆内存和方法区共享? ?(2) JVM是一个进程 ? ? ??方法区和堆内存共享-----一个方法区,一个堆 ? ? ??栈内存不共享,一个线程一个栈------多个栈 2、单核多核cpu与线程并发之间关系? ? ? 单核cpu--在一个时间点上实际上只能处理一件事 ? ? ? ? ? ? ? 如线程a。b并发执行,实际上是两个线程循环切换执行,速度很快,让我们产生同时进行的错觉 ? ? ? ?多核cpu---在一个时间点上可以处理多件事,真正的并发执行 ? ? ? ? ? ? ? 如4核,可以4个进程并发执行 ? ? ? 二、创建线程的三种方式(一)无返回值---Thred类和Runnable接口1、继承Thread类
2、实现Runnable接口
3、线程的启动---start()?? ? ?start()启动线程,开辟新的栈空间,瞬间结束,线程run方法开始执行。 ? ? ? 启动的线程与目前主线程后续代码并发执行 4、run()与start()区别
(二)有返回值---实现callable接口1、作用 ? ? ?可以拿到线程的返回值,即线程的执行结果 2、实现callable接口中没有run方法,其中call()方法相当于run方法, ? ? ? ? ?call方法有返回值,而run方法没有返回值 3、优缺点: ? ? ? ?优点:可以获取到线程的执行结果 ? ? ? ?缺点:效率较低,在获取t线程执行结果的时候,当前线程受阻塞,效率较低 4、具体实现过程?方式一
方式二
三、线程的生命周期?? ?1、新建状态:new线程对象 ? ?2、?就绪状态:start调用之后(可运行状态),表示当前线程具有抢夺cpu时间片的权利 ? ?3、?运行状态:run方法执行,当占有的cpu时间片用完之后,会重新回到就绪状态继续抢夺 ? ?4、?阻塞状态:遇到阻塞事件后,如sleep中止正在执行的线程,线程会放弃占有的cpu时间片 ? ? 5、?死亡状态:程序结束 【注】
四、线程常用方法1、获取当前线程对象----Thread.currentThread()? ? main方法中---当前线程就是main方法 ? ? 线程类中---谁在执行run方法,当前对象就是谁 2、获取和设置线程名称---线程对象.setName()3、线程休眠----Thread.sleep(毫秒)? ? 作用:让当前线程进入阻塞状态,放弃占有的cpu时间片 (1)线程的调用:类名.sleep() (2)静态方法与对象无关,只能用类名进行调用,且在哪调用,哪个线程休眠 ? ? ? ? 如,在main方法中调用终止主线程,在自定义线程中调用终止自定义线程? ? 4、唤醒睡眠---线程对象.interrupt()5、终止线程---stop()一个线程本来运行结束需要10s,需要在5秒后终止该线程,即只让线程执行5秒 (1)强行终止线程的执行---stop() ? ? 缺点:容易丢失数据, ? ? ? ?这种方式是直接杀死线程,线程没有保存的数据容易丢失 (2)合理终止线程的执行---打标记run=true,当run=flase--->return; ? ? ? ?在return前有想要保存的数据可以加save语句进行保存。 6、守护线程----线程对象.setDaemon(ture)? ? ?作用:调用守护线程的用户线程结束,守护线程随之结束,即使守护线程是死循环需一直运行 ? ? ? ? ? ? ? ?即,守护线程的生死不由其本身的运行状态决定,由其用户线程决定 ? ? ? ? ? ? ? ?如,t是守护线程,main方法中调用并启动该线程,此时main方法是其用户线程 ? ? ? ? ? ? ? ? ? ? ? 当main方法执行结束后,t线程也随之结束,不管run方法是否执行完毕 7、设置线程调度优先级---Thread.currentThread().setPriiority(1)? ? ?优先级设为1 8、线程让位----Thread.yied()? ??? 在哪个线程中调用该函数,哪个线程等待,不执行(静态类,类名.调用) 9、线程合并----t.jion()? ? ?谁调用jion函数,谁先执行,其他线程等待(线程对象.调用) 10、线程等待----对象.wait()? ?作用:? ?让当前线程等待并释放占有的共享对象锁 11、唤醒线程-----对象.notify()? ?作用:-唤醒线程,但不释放共享对象之前占有的锁 ? ?notifyAll()---唤醒该对象上等待的所有线程 【注】sleep()和wait()区别? ? ?1、sleep来自Thread类----线程对象的方法【Thread.sleep()】----让线程休眠进入阻塞状态, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?放弃占有的cpu时间片,但不释放锁 ? ? ? ? ? wait来自object类----Java对象的方法【对象.wait()】-----让本线程等待唤醒再执行, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 释放占有的锁 ? ? 2、sleep任何地方都可以,在哪个地方调用,对应哪个线程类休眠 ? ? ? ? ?wait只能在同步代码块中使用,共享变量调用并等待 ? ? 3、sleep需要捕获 ? ? ? ? ?wait不需要 12、计时器 ---Timer(1)创建定时器对象 ? ? ? ?Timer timer =new Timer(); (2)指定定时任务 ? ? ?? ?timer.schedule(要执行的任务类对象,开始执行任务时间,间隔多久执行一次) (3)编写需要执行的任务类---extend TimerTask
四、线程通信---生产者消费者模式1、线程通信方式(1)缓冲区 (2)信号灯法 2、实现线程通信方法3、消费者生产者? (1)利用缓冲区解决:管程法 ? ??缓冲区空,消费者wait(),生产者生产,notify()唤醒消费者 ? ? 缓冲区满,生产者wait(),消费者消费,notify()唤醒生产者 (2)信号灯法--flag ? ? 根据flag真假来决定某一个线程进行,真代表一个,假代表一个 五、线程调度
? ? ? ?时间片用完之后重新抢占执行时间,线程的切换不由线程本身来决定(Java使用的线程调度方式就是抢占式调度)。 ?? |
|
PHP知识库 最新文章 |
Laravel 下实现 Google 2fa 验证 |
UUCTF WP |
DASCTF10月 web |
XAMPP任意命令执行提升权限漏洞(CVE-2020- |
[GYCTF2020]Easyphp |
iwebsec靶场 代码执行关卡通关笔记 |
多个线程同步执行,多个线程依次执行,多个 |
php 没事记录下常用方法 (TP5.1) |
php之jwt |
2021-09-18 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/17 2:33:21- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |