线程
程序:保存在物理介质中的代码片断
进程:程序运行起来 就是一个进程
线程:程序当中一条独立执行的线索
宏观并行 微观串行
Java是第一款在语言级别支持多线程的编程语言
线程的生命周期(5大)
初生 就绪 运行 消亡
阻塞
如何创建线程 如何让线程达到新生状态
1.extends Thread
2.implements Runnable
如何让线程达到就绪状态
调用start();
# 守护线程 (gc)
如何让线程达到运行状态
程序员无能无力 CPU主导 分配时间片
运行状态线程执行自己的run()
如何控制线程:
0 setPriority();//设置线程优先级 不推荐使用 因为它依赖操作系统
1 sleep(millis);//让线程从运行状态去到阻塞状态
2 yield();//让当前线程返回就绪状态 [无法保证一定执行其他线程]
3 join();//当前线程邀请调用方法的线程优先执行 在调用方法的线程执行
//结束之前 当前线程不能再次执行
用两种不同的方式 实现两个线程
线程1:打印1-26
线程2:打印a-z
尝试使用学过的控制线程的方式 尽量实现 1 a 2 b 3 c...交替打印
多个线程共享数据的时候 很容易出现并发错误
独立的线程完全可以自己执行自己的逻辑 不需要考虑其他线程的情况
一旦涉及到共!享!数据 必须要考虑其他线程的操作完整性
多个线程共享数据的时候 需要引入Java当中的同步机制
synchronized
Java采用每一个对象都有一个互斥锁标记 并且结合synchronized
语法对线程执行代码前进行判断(检查)
检查是否已经获得synchronized(临界资源)的锁标记
如果能够得到则正常执行
如果不能得到 进入这个对象的锁池等待其他线程释放锁标记
出synchronized代码块 线程自动释放资源
锁池当中线程 自动回到就绪
1。修饰代码块
synchronized(stu){
...//条件是必须先拿到stu锁标记
}
2。修饰方法
public synchronized void add(){ }
等价于
public void add(){
synchronized(this){ }
}
# 单例模式 synchronized其实很简单 就是让当中的代码能够连续执行
synchronized
synchronized(临界资源){
}
进入这对大括号 必须拿到临界资源的锁标记
如若拿不到锁标记 进入锁池当中等待
执行到大括号结束 自动释放锁标记
互斥锁标记/锁旗标/监视器/monitor
修饰代码块
修饰方法