【JavaEE】Day11-多线程
1.进程
1.1 概念进程:程序运行时,系统会开辟的一块空间给这个程序,这个空间就是进程线程:是进程中的单个顺序控制流,是一条执行路径。 并行(多线程):单位时间片内,所有任务“可能”同时执行。意思是多线程在运行时,CPU在线程中随机切换,并发(单线程):单位时间片内,任务交替执行。意思是一个任务在执行的时候,其他的任务是不可以执行的,必须等这个任务执行完才能进行下一个任务。(Java是基于并发的)**CPU在不断地做高速切换线程的动作
1.2 实现多线程的方式1---Thead的实现类
方法:run() 在线程开启后调用次方法,相当于普通的调用方法start() jvm虚拟机调用run方法,jvm会帮我们开启一条执行路径。这个才是开启线程的
1.3 实现步骤1.定义一个类MyThread继承Thread类 2.在MyThread类中重写run()方法3.创建MyThread类的对象4.调用start方法启动线程1.3 设置和获取线程名称的方法setName(String name)----->设置线程名称getName()----->获取线程名称Thead currentThead().getName()----->返回正在执行线程对象的引用(意思就是返回主线程的名字)线程的优先级:java使用的是抢占式调度模式。final void setPriority(int newPriority)------>设置线程的优先级final int getPriority()----->获取线程优先级 (默认为5)final int getPriority(Thread.MAX_PRIORITY )----->获取线程最大优先级数final int getPriority(Thread.MIN_PRIORITY )----->获取线程最小优先级数线程数为1-10;static void sleep()------>使正在运行的线程暂时处于休息状态,暂时没有抢夺CPU的权利void.join()----->等待这个线程执行完毕,其他的才会执行void SetDaemon()------>将线程设置为守护线程,(意思就是主线程死亡,他就会随着主线程死亡,但并不是立即就结束)
1.4 线程的六种状态
NEW (创建了线程对象,但是还没有调用start方法)至今尚未启动的线程处于这种状态。
RUNNABLE(CPU正在执行该线程的状态)正在 Java 虚拟机中执行的线程处于这种状态。
BLOCKED(阻塞,其实就是有资格抢夺cpu执行权的线程,一种没有抢到的状态)受阻塞并等待某个监视器锁的线程处于这种状态。
WAITING(无限等待, 遇到了"锁对象"的wait方法,此时已经失去了抢夺权)无限期地等待另一个线程来执行某一特定操作的线程处于这种状态。
TIMED_WAITING(计时等待, 遇到了sleep,此时已经失去了抢夺权)等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态。
TERMINATED(死亡状态)已退出的线程处于这种状态。 2. 使用匿名内部类实现线程
实现代码:
public class Test03 {
public static void main(String[] args) {
//匿名内部类实现线程
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + i);
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(i);
}
}
}).start();
}
}
3. 同步代码块 卖票的案例 (代码在Day11项目下,BookingDemo中) 卖票案例中出现的问题:1.出现重复卖同一张票的情况2.出现了卖负号票的情况解决方案:(同步代码块)使用最多sychronized(锁对象){方法体 //被锁对象锁住的东西,只有这条线程执行完了,其他的线程才会进来}锁什么时候打开:执行到sychronized的左边的“{”时打开锁什么时候关闭:执行到sychronized的右边的“}”时关闭·注意·同步的好处和弊端*好处:解决了多线程的数据安全的问题*弊端:当有很多线程时,每个线程都有锁,都运行的时候需要判断锁的状态,很耗费资源,运行效率就会降低
代码案例:
/*
一共100张票,3个窗口同时出售
*/
子类
public class SeilTicket implements Runnable {
private int number =100;
@Override
public void run() {//重写run方法,实现3条线程同时执行while (true) {//添加同步代码块 ,this可以也可以换成o。(在上面定义一个Object o=new Object)synchronized (this) {//判断剩余的票是否大于等于0if (number <= 0) {break;//票数小于0,表示没有票了}//使用sleep修改毫秒值try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}//卖出去一张票,number就-1;number--;System.out.println(Thread.currentThread().getName() + "卖出去一张票,还剩" + number + "张票");}}
}
}
测试类
/*
一共100张票,3个窗口同时出售
*/
public class MaiPiaoDemo {
public static void main(String[] args) {
//创建实现类对象
SeilTicket ticket = new SeilTicket();
//设置3个窗口进行卖票
Thread t1 = new Thread(ticket,“窗口1”);
Thread t2 = new Thread(ticket,“窗口2”);
Thread t3 = new Thread(ticket,“窗口3”);
//启动线程
t1.start();
t2.start();
t3.start();
}
}
##公交车案例
/*
需求:
模拟有一个公交车上车的乘客和下车的乘客,一次上一个,一次下一个 交替执行
最多可上30人。
思路:
1.先定义一个bus类,定义一个变量乘客passenger;
2.定义一个上车和下车线程,重写Thead的run方法
3.用同步代码块把上车,下车的方法体包起来,用this锁锁起来,要判断上车不能超过30人,下车不能少于0人
4.用.wait等待线程,用this.notify唤醒其他线程
5.创建测试类,定义bus对象 ,用匿名内部类启动线程
*/
·Bus类
public class Bus {
private int passenger=0;
//上车线程
public void getOn() {//用同步代码块synchronized (this) {//判断当前车上是否为30人if (passenger >= 30) {try {wait();} catch (InterruptedException e) {e.printStackTrace();}}passenger++;System.out.println("上车1人,当前车上" + passenger + "人");//唤醒下车线程this.notify();}
}//下车线程
public void debus() {//同步代码块synchronized (this) {//判断车上人数是否为0if (passenger <= 0) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}passenger--;System.out.println("下车1人,当前车上" + passenger + "人");//唤醒上车线程this.notify();}
}
}
·测试类
public class Test {
public static void main(String[] args) {
//创建bus对象
Bus bus = new Bus();
new Thread(){
@Override
public void run() {
//用while循环上车线程
while (true){
bus.getOn();
}
}
}.start();//启动线程
new Thread(){
@Override
public void run() {
//用while循环上车线程
while (true){
bus.debus();
}
}
}.start();//启动线程
}
}
公交车升级版
·BusPlus类
package com.BusDemo;
import java.util.Random;
/*
公交车案例升级版
随机获得上车人数和下车人数
*/
public class BusPlus {
//定义乘客变量
private int passager;
//上车线程
public void geton1(){
//同步代码块
synchronized (this){
//判断人数是否超过30人
if(passager>=30){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//获取随机上车人数
Random r = new Random();
//随机数的范围是最多30人减去车上现在的人数,在加1,因为范围是从0开始的
int person = r.nextInt(30 - passager) + 1;
passager+=person;
System.out.println(“上车”+person+“人,现在车上一共”+passager+“人”);
this.notify();//唤醒下车线程
}
}
//下车线程
public void debus1(){
//同步代码块
synchronized (this){
//判断现在车上人数是否少于0
if(passager<=0){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//随机获取下车人数
Random r = new Random();
int person = r.nextInt(passager) + 1;
passager-=person;
System.out.println(“下车”+person+“人,现在车上一共”+passager+“人”);
this.notify();
}
}
}
·测试类
public class TestPlus {
public static void main(String[] args) {
BusPlus bus1 = new BusPlus();
new Thread() {
@Override
public void run() {
while (true) {
bus1.geton1();
}
}
}.start();
new Thread() {
@Override
public void run() {
while (true) {
bus1.debus1();
}
}
}.start();
}
}
【JavaEE】Day11-多线程相关推荐
- JavaEE多线程基本概念 及 创建多线程程序的三种方式
Hello! 大家好.(非常平庸的开场白 习惯一下).此篇博客是我的"处女作",因为是第一次写博客,在文章格式以及文章内容可能会有许多问题和缺陷.欢迎各位大神对我的文章进行指正!我 ...
- 黑马毕向东Java课程笔记(day11):多线程(第一部分)——进程与线程+线程创建+线程安全与同步代码块+同步锁/死锁
多线程好文:添加链接描述 锁机制:synchronized.Lock.Condition.volatile(原子性可见性)--参考添加链接描述 1.进程与线程概述 首先,对于CPU执行每一个程序, ...
- JavaEE - 多线程(进阶)
常见的锁策略 锁策略,和普通程序猿基本没啥关系.和"实现锁"的人才有关系的~ 这里所提到的锁策略,和Java本身没关系.适用于所有和"锁"相关的情况~~ 1.悲 ...
- 【JavaEE学习日记】----多线程基础(下)
承接上篇博文总结一下造成线程不安全的几个原因以及解决方法: ①抢占式执行,调度过程随机:这个没有解决办法,我们无能为力 ②多个线程同时修改同一个变量:适当调整代码结构,可以避免这种情况 ③针对变量的操 ...
- 【JavaEE学习日记】----多线程基础(上)
目录
- javaee 架构师之路
Java程序员 高级特性 反射.泛型.注释符.自动装箱和拆箱.枚举类.可变 参数.可变返回类型.增强循环.静态导入 核心编程 IO.多线程.实体类. 集合类.正则表达式. XML和属性文件 图形编程 ...
- 杨老师课堂之JavaEE三大框架Hibernate入门第一课
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/kese7952/article/details/80998421 本篇任务 1. 使用Hiberna ...
- java笔记:自己动手写javaEE
写这篇博客前,我有个技术难题想请教大家,不知道谁有很好的建议,做过互联网的童鞋应该都知道,有点规模的大公司都会做用户行为分析系统,而且有些大公司还会提供专业的用户行为分析解决方案例如:百度分析,goo ...
- JavaSE、JavaEE、JavaME、jdk、jre、jvm、java主要的11个特性
文章目录 1.JavaSE.JavaEE.JavaME是什么? 2.jdk.jre.jvm是什么? 3.java主要的11个特性 1.JavaSE.JavaEE.JavaME是什么? JavaSE(J ...
- java如何对一个表达式开根号_作为一个零基础的新手,如何系统的自学Java和JavaEE开发技术?...
0基础就找资料学习吧,建议不要看书,选择视频更好,对于新手来说,书本如果在没有人指导之下去看基本上很难看懂 在你学习Java之前一定要去了解一下这门语言,千万不要脑子热就选择来这行 如何系统的自学Ja ...
最新文章
- 你不知道的Vue响应式原理
- android 后台服务拍照,Android实现后台开启服务默默拍照功能
- python读文件代码-Python读取表格类型文件代码实例
- oracle 日期格式转换 ‘ddMONyyyy’ 'ddMMMyyyy'
- professor xi‘s story
- ECCV2020 Spotlight | 图像定位上的细粒化区域相似性自监督
- idea js检查太卡_IntelliJ IDEA抑制、禁用与启用检查
- sci translate好用吗_收藏!SCI论文Introduction 和Conclusion的写作建议
- 71. 尽早刷新文档的输出
- Dubbo 是如何控制并发数和限流的?
- Citrix XenApp工作原理
- android网页去广告插件下载,Adblock Plus(去广告插件)APP增强稳定版
- 放大电路分析方法、图解法分析放大电路、lceda仿真
- 区块链浏览器构建实战
- IT管理到底是做什么
- 第五篇 《小强升职记》
- 买手机怎么选?答:看图买
- 用java实现从txt文本文件批量导入数据至数据库
- 高斯混合模型(GMM--Gaussian mixture model)
- Go语言学习之打印九九乘法表