线程(一)
电脑中的软件
QQ 微信 内网通等启动起来后都是进程
需要占用内存 磁盘 等
1.1 进程的特性
1.独立性
各个进程之间是相互的独立的互不影响 的。录屏软件和idea没有关系的
自我看法: 每个程序都是独立存在的互相没有关联的 一个进程关闭不影响另一个进程运行
2.互斥性
每个软件系统都会分配一个独立端口号,如果启动一个软件以后他的端口号97。
如果再启动另外一个软件,另外一个软件如果端口也是97,这个程序就启动不了,端口被占用的
自我看法: 每个进程端口号都是唯一的 如果有两个端口号相同 一个启动后 另一个再启动 这个进程是无法启动的 因为端口被占用
2. 什么是线程
线程是看不到的 是进程下存在的东西
java程序中一个进程就是一个Demo 每个进程至少有两个线程
一个main主线程 一个jvm垃圾回收线程
2.1 线程的特性
1.抢占式运行【重要】
CPU在执行的时候,按照时间片来执行的,单位的时间片是抢占是执行
比如 idea qq 抢占CPU的,比如qq的线程抢到cpu,idea线程等待
我是一个cpu。你们问我问题。75个线程。同时来问我问题吗?不是
抢着问。一个问。然后其他人等待。这个人甚至还没有问完,其他的某一个人
2.资源共享性
一个线程可以共享当前CPU, 网卡等
3. 线程和进程的区别【面试题】
进程是一个应用程序,是独立的
线程是进程中最小的基本单位。
把进程比作生产车间,每个流水线就是一个线程
进程有独立性和互斥性
线程有抢占式资源共享特性
4. 并发和并行
并发:同时发生 轮流交替进行
并行:同时执行
比如:
你去饭店点了两个菜,生活中拿个筷子轮流夹菜哦这就是并发场景
端起盘子,同时倒到嘴里面,这就是并行场景
5. 创建线程的两种方式【重要】
5.1 Thread类
首先创建类继承Thread类
class A extends Thread {
}
然后重写Thread中run方法
语法格式
class A extends Thread {
package com.day22_w.a_Thread;
class MeThread1 extends Thread {
5.2 Runnable接口【常用】
首先创建一个类实现Runnable接口
Class B implements Runnable {
}
重写Runnable接口中run抽象方法
Class B implements Runnable {
package com.day22_w.a_Thread;
class Eat1 implements Runnable {
6. 线程下的几个方法
6.1 构造方法
构造方法
Thread() 无参构造 分配一个新的线程
Thread(Runnable target, String name) 分配一个新的线程 并起名
6.2 线程方法
线程方法
String currentThread(); 获取当前线程对象
void setName; 给当前线程起名
Stirng getName; 获取当前线程名称
void setPriority; 给当前线程设置优先级 默认优先级为5
int getPriority; 获取当前线程优先级
static void sleep; `使当前正在执行的线程以指定的毫秒数暂停
package com.day22_w.b_ThreadFun;
class MyThread implements Runnable {
package com.day22_w.b_ThreadFun;
class MyThread3 implements Runnable {
package com.day22_w.b_ThreadFun;
class MyThread5 implements Runnable {
为什么要进行线程的同步?
Java是允许多线程(多个线程),当多个线程操作同一个资源(咋操作)的时候,会导致得到或者打印的数据不准确。从而发生冲突。咋解决?加同步锁。
美团
淘票票
这个两个线程,都去麦同一场次的票
结果美团卖出去一张1排1列的票
结果淘票票也卖出去了1排1列的票 你感觉合适吗?
就是上面的这种结果!!!不合适的,分享同一个资源的时候,要保证分享资源的数据,合法性!!!
分析结果:
package com.qfedu.c_sync;
//最理想的状态!!!
//先线程1进入到ticket=50,循环 循环结束以后 此时
//tiket=49了
//循环第二次的时候 线程2抢到资源了 此时ticket=49
//循环 打印49 tiket-- ticket=48了
//循环第三次的时候 线程2 抢到资源了, 此时ticket=48
//打印卖第48张票。ticket-- tiket=47
//线程1又抢到循环
//现在的情况是:有可能两个线程同时进入到while循环
//
class MySync implements Runnable {
int ticket = 50;
解决方案:
1.同步方法:使用一个关键字synchronized修饰方法。因为Java对象都有一个内置的锁对象。当使用这个关键字的时候,修饰方法的时候,这个方法就会被锁保护起来被锁锁住
当一个线程进来以后,会立马锁住当前的方法。意味着只有一个线程进来,其他线程都在外面等着。
public synchronized void run () {
}
package com.qfedu.c_sync;
//最理想的状态!!!
//先线程1进入到ticket=50,循环 循环结束以后 此时
//tiket=49了
//循环第二次的时候 线程2抢到资源了 此时ticket=49
//循环 打印49 tiket-- ticket=48了
//循环第三次的时候 线程2 抢到资源了, 此时ticket=48
//打印卖第48张票。ticket-- tiket=47
//线程1又抢到循环
//现在的情况是:有可能两个线程同时进入到while循环
//
class MySync1 implements Runnable {
int ticket = 50;
//对这个run方法加了锁 就意味着只有一个线程进入到run方法中
//其他线程都在run方法外面等待
换另外一种解决方法:
同步代码块:就是拥有了synchronized 关键字修饰一个语句块。被修饰的语句块会被加锁。从而实现同步。
语法格式:
synchronized (this) {
被加锁的代码块
}
package com.qfedu.c_sync;
//最理想的状态!!!
//先线程1进入到ticket=50,循环 循环结束以后 此时
//tiket=49了
//循环第二次的时候 线程2抢到资源了 此时ticket=49
//循环 打印49 tiket-- ticket=48了
//循环第三次的时候 线程2 抢到资源了, 此时ticket=48
//打印卖第48张票。ticket-- tiket=47
//线程1又抢到循环
//现在的情况是:有可能两个线程同时进入到while循环
//
class MySync2 implements Runnable {
int ticket = 500;
//对这个run方法加了锁 就意味着只有一个线程进入到run方法中
//其他线程都在run方法外面等待
针对于同步代码块举个例子:
上厕所的时候,有坑位,这个坑位就是资源。
三个人去抢这个资源,如果不加锁的话,会出现问题的?是的。加上锁以后就会保证数据准确性。
案例:
加锁的目的为了保证数据的准确性。
卖电影票:
三个线程:
淘票票
美团
猫眼
100张票
package com.qfedu.c_sync;
class SaleTicket implements Runnable {
//声明一个变量票
//静态的变量和对象没有关系了
private static int ticket = 100;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本