JavaSE基础 (三十二)

主线程 系统线程

用户线程 main

守护线程 GC

线程——操作系统级别 CPU

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

掌握线程的几种不同状态以及如何切换

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

实现线程的过程

自己描述一个类

基础父类Thead

重写run方法

new一个线程对象 调用start方法让线程进入就绪状态

实现线程的过程

自己描述一个类

实现一个父类接口Runnerable

重写run方法

new一个线程对象 需要创建Thead将自己包起来 然后调用Start()

生产者和消费者模型

通过这个模型 成功演示出 线程的安全问题

两个消费者 同时访问一个仓库对象 仓库内只有一个元素的时候
两个消费者 并发访问 会有可能产生抢夺资源的问题

自己解决一下线程安全的问题

让仓库对象被线程访问的时候 仓库对象被锁定
仓库对象只能被一个线程所访问 其他对象处于等待状态
特征修饰符
synchronized 同步 一个时间段只有一个线程能访问

线程安全锁两种写法

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

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

将synchronized关键字 方法在(构造方法内部)的内部

public void get(){
     好多代码
     synchronzied(对象){
     好多代码
     }
     好多代码
}

我们觉得return 不是很好

应该让线程的不同状态来回切换
执行 等待 执行 等待
wait() Object类中的方法
对象.wait();
对象.wait();不是当前对象wait 
             访问当前这个对象的线程wait
 notify
 notifyAll
 p.setPriority(10);   p.getPriorty();
 产生一个类似假死的状态
 所有的线程进入等待状态 没有线程做事

笔试题

程序 进程 线程 概念的区别

线程的创建方式

线程的几种状态 如何切换

sleep方法 和 wait方法区别

1.类    Thead类                       Object类
2.调用  静态 类名                       对象
3,理解  那个位置调用                    对象调用的方法
      那个线程等待                    访问对象的其他线程等待
4.唤醒   不需要别人                     需要其他对象调用notiy唤醒
5.锁    不会释放锁                      等会会释放锁

比较重要的方法 join

设计一个模型
1.有两个线程 One   Two  Two加入到One里面
2.设计模型的时候  two线程在one的run里面创建 保证两个先后顺序
3.Two.join();  无参数==0; 有参数==2000
         two.join(0){
         while(two.isAlive()){
                    Two.wait(0);//访问Two的线程进入等待状态
         }

死锁

一旦对象锁定 不释放的情况下其他对象都需要等待 有可能会产生死锁的效果

哲学家就餐问题

解决死锁的问题

礼让—–>产生时间差

不要产生公用对象问题