Thread

程序 可以理解为静态代码

进程 正在进行的程序 静态的代码 运行起来

线程 正在执行程序中的小单元

1.主线程   系统线程

2.用户线程   main

3.守护线程    gc(跟随系统线程)

线程------------操作系统级别 cpu

如何在java中创建线程 让线程执行 多线程

线程的状态

  ne   start( cpu分配run()  wait()      exception/over
创建线程---就绪状态--执行状----等待/挂起-------异常/消亡           
                |                               |
                |                               |
                |_______________________________|
                        notify(唤醒)/notifyAll(唤醒所有)

实现线程的过程

方法一:(存在问题:单继承,子类继承父类时,无法再继承线程)

1.自己描述一个类
2.继承父类的Thread
3.重写run方法
4.new一个线程队形 调用start() 让线程进入就绪状态

方法二:

1.自己描述一个类
2.实现一个父接口Runnable
3.重写run方法
4.new一个线程队形 需要创建Thread将自己的对象包起来 然后调用start()

特征修饰符

synchronized(线程安全锁) 同步 一个时间点只有一个线程访问

1.将synchronized关键字放在方法的结构上

public synchronized void test(){} 锁定的是调用方法时的对象

2.将synchronized关键字放在方法(构造方法 块)的内部

public void get(){
    代码1
        synchronized(对象){//除了能锁定当前对象(this),也可以锁定其他对象
        代码2
    } 
    代码3
}

线程状态的切换

执行 等待 执行 等待

Object类中的方法:

wait() 对象.wait()--访问当前对象的线程进入wait状态
notify()/notifyAll()

Thread中的方法

sleep()
run()
start()
所有线程都进入wait状态的话,会产生假死状态:没有线程做事

不加锁可能出现的异常:

ArrayIndexOutOfBounsException:-1:数组越界

IllegalMonitorStateException:让其等待的线程对象不是当前线程的所有者															(访问仓库的线程等待,告知生产者的这一刹那,对象变成了另一个线程)

完善生产者消费模型

1.利用线程安全锁 特征修饰符(同步锁) synchronized

两种不同的写法
不管怎样写 锁定的永远是对象

2.利用方法控制线程状态的来回切换

wait
notify notifyAll

3.Thread类中的方法

sleep() 静态方法(毫秒值)
setPrioity(10) getPriority()------设置/获取线程的优先级 1-10

sleep()与wait()的区别

			 sleep()                     wait()

1.类         Thread类                     Object类

2.调用        静态 类名.                     对象.

3.理解     哪个线程调用                   访问该对象的线程进入等待
		   哪个线程等待                   状态

4.唤醒      不需要别人                  需要其他对象调用notify唤醒

5.锁         不会释放锁                    等待后会释放锁

join()--Thread中的方法

让多个线程并行变成单个线程

testjoin模型:
设计模型的时候,two线程在one的run里面创建  两个有先后顺序
模型执行顺序:
one 启动
two 启动
three 启动
two.join()
2000之后, one想要把two从自己线程内剔除
two对象不在自己手里 被three锁定 10000
one只能等待three将two对象释放后 才能踢掉   
synchronized锁,一旦对象被锁定,其他的对象都需要等待
有可能会产生一个死锁的效果

6.死锁

模拟一个模型 演示死锁(哲学家就餐问题)
四个线程同时并发去抢夺相同的资源

解决死锁问题:

1.礼让---产生时间差
2.不要产生对象公用的问题
计时器/定时器----->线程应用
java.util包
Timer类
无参数构造方法 创建对象
timer.schedule()   
posted @ 2020-10-18 19:15  Zh'Blog  阅读(110)  评论(0编辑  收藏  举报