Java多线程

1.程序、进程与线程
程序(Program):程序是一段静态的代码,它是应用程序执行的蓝本
进程(Process):进程是指一种正在运行的程序,有自己的地址空间
进程的特点
动态性
并发性
独立性
并发和并行的区别
多个CPU同时执行多个任务
一个CPU(采用时间片)同时执行多个任务
线程(Thread):进程内部的一个执行单元,它是程序中一个单一的程序控制流程
线程又被称为轻量级进程(lightweight process)
如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为多线程
线程特点
轻量级进程
独立调度的基本单位
可并发执行
共享进程资源
2.线程的创建和启动
1.继承Thread类,重写run()方法,调用start方法
2.实现Runnable接口,并实现run()方法
PS:因为start方法是Thread类的一个方法,我们在实现Runnable接口的时候并没有实现start方法,所以需要借助Thread类来调用start方法
3.实现Callable接口,重写call方法
Thread类常用方法
在这里插入图片描述
静态代理
1.真实角色
2.代理角色
lamda表达式 简化线程(用一次)的
静态内部类
局部内部类
匿名内部类 必须借助接口或者父类
jdk 8简化 lambda

new Thread(()->{
	for(int i = 0; i < 20; i++){
		System.out.println("一边听歌");
	}
}).start();

3.线程的生命周期
在这里插入图片描述
1.新生状态
2.就绪状态
①start
②解除
③yield
④JVM
3.运行状态
4.堵塞状态
①sleep
②wait
③join
④read write
5.死亡状态
线程停止
不使用JDK提供的stop()/destroy()方法(它们本身也被JDK废弃了)
提供一个boolean型的中止变量 ,当这个变量置为false,则中止线程的运行
线程执行完毕–>次数
4.线程控制方法
深度观察状态
NEW
RUNNABLE
TIMED_WAITING
TERMINATED
Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程。线程调度器按照线程的优先级决定应调度哪个线程来执行。
优先级(priority)
1-10 概率 不代表绝对的先后顺序
1.NORM_PRIORITY 5 默认
2.MIN_PRIORITY 1
3.MAX_PRIORITY 10
join():堵塞指定线程等到另一个线程完成以后再继续执行(插队)
sleep():使线程停止运行一段时间,将处于堵塞状态,如果调用了sleep方法之后,没有其它等待执行的线程,这个时候当前线程不会马上恢复执行!
yield():让当前正在执行线程暂停,不是堵塞线程,而是将线程转入就绪状态,如果调用了yield方法之后,没有其他等待执行的线程,这个时候当前线程就会马上恢复执行!
setDaemon():可以将指定的线程设置为后台线程,创建后台线程的线程结束时,后台线程也随之消亡,只能在线程启动之前把它设为后台线程
interrupt():并没有直接中断线程,而是需要被中断线程自己处理
stop():结束线程,不推荐使用
守护线程(daemon):是为用户线程服务的;JVM停止不用等待守护线程执行完毕
默认:用户线程 JVM等待用户线程执行完毕才会停止
setdaemon(true)
其它方法:
isAlive:线程是否活着
Thread.currentThread():当前线程
setName()
getName()
5.线程同步
当多个线程访问同一个数据时,容易出现线程安全问题。需要让线程同步,保证数据安全
线程同步:当两个或两个以上线程访问同一资源时,需要某种方式来确保资源在某一时刻只被一个线程使用
线程同步的解决方案
1.等待池形成队列
2.锁机制(synchronized)
①同步代码块
synchronized(obj){}
②同步方法
private synchronized void makeWithdrawal(int amt){}
将一个大的方法声明为synchronized将会大大影响效率
同步监视器
synchronized(obj){}中的obj称为同步监视器
同步代码块中同步监视器可以是任何对象,但是推荐使用共享资源作为同步监视器
同步方法中无需指定同步监视器,因为同步方法的同步监视器是this,也就是该对象本身
同步监视器的执行过程
第一个线程访问,锁定同步监视器,执行其中代码
第二个线程访问,发现同步监视器被锁定,无法访问
第一个线程访问完毕,解锁同步监视器
第二个线程访问,发现同步监视器未锁,锁定并访问
线程同步的好处:解决了线程安全问题
线程同步的缺点:性能下降,会带来死锁
死锁
当两个线程互相等待对方释放”锁“时就会发生死锁
出现死锁后,不会出现异常,不会出现提示,只是所有的线程都处于堵塞状态,无法继续
多线程编程时应注意避免死锁的发生

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值