0、线程相关知识

0.1:程序:写好的代码

0.2:进程,运行中的程序

  • 进程是程序的一次执行过程,或是正在运行的一个程序。是动态过程:有它自身的产生、存在和消亡的过程

0.3:线程

  • 线程是由进程创建的,是进程的一个实体
  • 一个进程可以拥有多个线程

0.4:其他相关概念

  1. 单线程:同一个时刻,只允许执行一个线程
  2. 多线程:同一个时刻,可以执行多个线程,比如一个qq进程,可以同时打开多个聊天窗口,一个迅雷进程,可以同时下载多个文件

0.5:并发

0.6:并行

  • 单核CPU执行的任务叫做并发
  • 多核CPU执行的任务叫做并行
  • 电脑上也有并发和并行同时有的情况

二、继承Thread创建线程

1.1:线程基本使用


1.2:线程应用案例1-继承Thread类

1.3:简单总结

案例1简单流程总结:

  1. 程序从main方法中创建主线程main
  2. 主线程中创建Thread01子线程
  3. 主线程先结束执行,子线程Thread01后结束执行
  4. 等到进程内线程全部结束,进程才会结束

1.4:为什么是start()而不是run()

  • run方法只是一个普通的方法,并没有真的启动一个线程
  • 如果是cat.run(),就会把run方法执行完毕,才会继续执行下面的代码
  • 这样就变成串行执行,而不是并行
  • start才会真正的执行一个线程

1.5: 简单总结p5

  • 读start方法的源码发现
  • start方法中调用了start0方法
  • start0方法才是真正实现多线程的方法,由JVM虚拟机调用,是C/C++写的
  • start0内部调用run方法

三、实现runnable接口,实现多线程

3.1 代理模式-静态代理

由于Thread内部实现了静态代理,所以复习一下

  1. 什么是静态代理?例子:房东和房客
  2. 房东-中介-房客,交易对象本来是房东和房客,加入代理以后交易对象变成房东-中介,中介-房客。换言之房东不直接和房客交易
  3. 为什么要用代理?减少代码冗余,如果在原本写好的代码上新增代码,容易写错,加入代理后将代码写在代理上即可

多线程

写一个小案例,启动两个子线程

5.1 Thread和Runnable的区别

  • 使用Runnable接口可以实现多个线程共享一个资源的情况(如图)

5.2 多线程售票系统

5.3.线程终止问题

public class ThreadExit {public static void main(String[] args) throws InterruptedException {T t = new T();t.start();Thread.sleep(4000);t.setLoop(false);}
}class T extends Thread{boolean loop = true;@Overridepublic void run() {int count=0;while (loop){System.out.println("我在运行、。。"+count++);try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}}void setLoop(boolean loop){this.loop = loop;}
}

线程常用方法



用户进程和守护进程

线程的生命周期


线程同步


互斥锁


线程死锁

释放锁


题目1:B输入Q退出A的循环输出


/*** 写一个双线程程序* A线程打印整数,直到B线程输入Q* @author 86176*/
public class HomeWork01 {public static void main(String[] args) {A a = new A();B b = new B();a.start();b.start();}
}class A extends Thread{static boolean flag = true;int count = 0;public static void setFlag(boolean flag) {A.flag = flag;}@Overridepublic void run() {while (flag){System.out.println(count++);try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}}
}class B extends Thread{@Overridepublic void run() {Scanner sc = new Scanner(System.in);String s = sc.next();if (s.equals("Q")){A.setFlag(false);}}
}

题目2:A和B一起取钱,取完退出


/*** 取钱案例,多线程* @author 86176*/
public class TakeMoney {public static void main(String[] args) {Take take = new Take();Thread th1 = new Thread(take);Thread th2 = new Thread(take);th1.start();th2.start();}
}class Take implements Runnable{int money = 10000;@Overridepublic void run() {while (true){synchronized (this){if (money<1000){System.out.println("余额不足,已退出");break;}money = money-1000;System.out.println(Thread.currentThread().getName()+"取款成功,余额还剩,"+money);try {Thread.sleep(400);} catch (InterruptedException e) {e.printStackTrace();}}}}
}

【10分钟复习】java 多线程专题极速版 面试用相关推荐

  1. ubuntu 19.10 完美安装 微信 tim 迅雷极速版 搜狗输入法

    背景 之前写过一篇文章关于安装ubuntu的,现在讲讲怎么安装些常用软件.这里说明下为什么直接跳过主题优化呢,其实用ubuntu的大部分都是熟悉linux环境.对于linux运维来说,多数都在命令行上 ...

  2. 很多小伙伴不太了解ORM框架的底层原理,这不,冰河带你10分钟手撸一个极简版ORM框架(赶快收藏吧)

    大家好,我是冰河~~ 最近很多小伙伴对ORM框架的实现很感兴趣,不少读者在冰河的微信上问:冰河,你知道ORM框架是如何实现的吗?比如像MyBatis和Hibernate这种ORM框架,它们是如何实现的 ...

  3. Java多线程专题一:并发所面临的问题

    并发的概念: 在Java中是支持多线程的,多线程在有的时候可以大提高程序的速度,比如你的程序中有两个完全不同的功能操作,你可以让两个不同的线程去各自执行这两个操作,互不影响,不需要执行完一个操作才能执 ...

  4. 希尔排序大详解,保证10分钟内学会希尔排序(进化版插入排序)

    希尔排序 核心思想是化远为近: 1.使查找次数减少 2.从而移动元素的次数减少 文章目录 希尔排序 动画引入 一.希尔排序的代码(两个函数实现) 二.希尔排序(一个函数实现) 总结 动画引入 提示:颜 ...

  5. 做了三年前端,你才知道10分钟就能实现一个PC版魔方游戏

    导读:最近手头有点紧,看到很多小朋友都在玩魔方,又没有money买,只能自己用JavaScript+css实现一个,在电脑端就能开启魔方之旅. 目录 项目启动演示 项目目录 ​源码地址 项目启动演示 ...

  6. ictclas java 下载,10分钟开始使用ICTCLAS Java版

    ICTCLAS是中科院计算所出品的中文分词程序包,在国内一直有着良好的口碑和很高的使用率.之前一直只有 C++的版本提供,而现在C#,Delphi和Java版本已经纷纷出炉.下面用一个极小的例子,让大 ...

  7. Java Threads 多线程10分钟参考手册

    1         同步 如何同步多个线程对共享资源的访问是多线程编程中最基本的问题之一.当多个线程并发访问共享数据时会出现数据处于计算中间状态或者不一致的问题,从而影响到程序的正确运行.我们通常把这 ...

  8. Java多线程总结版

    1. 线程和进程有什么区别? 线程具有许多传统进程所具有的特征,故又称为轻型进程(Light-Weight Process)或进程元:而把传统的进程称为重型进程(Heavy-Weight Proces ...

  9. 尚硅谷Java零基础极速入门七天版笔记

    Java零基础极速入门 文章目录 Java零基础极速入门 1 Java快速入门 1.1计算机语言 1.2 Java语言 1.3 JVM 1.4 环境配置 2 基础语法 2.1 变量 2.2 标识符 2 ...

最新文章

  1. IDEA安装和运行HelloWorld
  2. 集群、RAC和MAA
  3. i=i+1,i+=1与i++的区别
  4. 在ListView控件中绘底图
  5. Win10文件夹大小分析、磁盘空间清理工具
  6. 【一天一个C++小知识】011.C++编译的流程
  7. Instruments-Automation: 通过命令行执行测试用例
  8. linux自带python_【经验总结】linux 安装python (替换系统自带的python版本)
  9. 废旧安卓手机利用(一)安装linux系统(Centos、Debian)
  10. 2023年天津农学院专升本停招专业的备考建议?
  11. 贷款用户逾期问题Task1
  12. 基于SSM实现的简易员工管理系统(基于阿里云的网站上线篇)
  13. 常见网络设备分类和工作分层
  14. 针对某个WEB渗透的整套修复建议(更新部分)
  15. 分销商城系统体系设计
  16. 各个公司项目阶段划分
  17. Java实现蓝桥杯模拟约数的个数
  18. Android Studio《一行代码》3.3.4 百分比布局
  19. console.log 用法
  20. 一种 用于GPT模型 训练的 包含加权 和 数据增强 和 损失方法 的设计

热门文章

  1. 基于显扬科技自主研发3D机器视觉HY-MX在卫浴柔性打磨中的应用
  2. 红米10X和荣耀Play4TPro参数对比-拍照哪个好?
  3. jdk1.8下载需要登陆oracle账号解决
  4. 利用计算机的随机模拟结果帮助学生,对小学数学课堂教学有效性的思考
  5. R语言绘图:实用脑科学数据可视化包
  6. Locust压力测试
  7. 视觉螺丝机应用解决方案
  8. IBM推出创建语言运行时的工具包Eclipse OMR
  9. 谷歌造出首台完整功能无人驾驶车 明年上路
  10. linux系统uptime解读,linux uptime和系统负载