黑马程序员_多线程2

来源:互联网 发布:mac os 10.12.6升级包 编辑:程序博客网 时间:2024/06/11 04:52

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------



1. Thread.sleep(int ms)方法和Object中的wait()区别在哪里
  |-- sleep()不需要锁支持
  |-- wait()方法,需要锁的支持


  |-- sleep()到时间线程休眠结束
  |-- wait()需要其他线程唤醒


  |-- sleep() 不释放锁,其他线程进不到同步中去
  |-- wait()  释放锁,当被其他线程唤醒的时候,从新获取锁,才能继续运行




2. 生产者与消费者
  |-- 通过生产者与消费者的案例,需要做唤醒全部线程notifyAll()
  |-- 我们发现,唤醒本方是没有意义,唤醒全部是浪费资源的
     |-- 只唤醒对方中的一个线程,JDK1.4版本之前,没有这样的功能




3.JDK1.5(包含)版本,提供了新的线程操作方式,Lock锁,做到唤醒对方中的一个线程
  |-- 效率的大幅度提升替代传统的 synchronized代码块
  |-- 开发了新的方法,替代wait    notify notifyAll
                          await()  signal() signalAll()
  |-- 需要导入包:import java.util.concurrent.locks.*;


  |-- Lock接口,子类对象ReentrantLock,lock(),unlock();
  |-- Condition对象,替代了wait notify等方法
     |-- 可以对线程进行分组管理
        
4. 停止线程的两个方式:根本原理结束run方法
  |-- Thread类中的方法 void interrupt()
  |-- 这个方法,会让处于等待状态的线程,抛出InterruptedException
     |-- 生活中实例,我有一个朋友,失眠,找了一个很牛催眠师
         朋友去了以后5分钟,睡着了
催眠师死了,我呢一板砖下午,哥们醒了,头部受伤(相当于抛出异常)
 
5. 守护线程
  |-- 圣斗士五小强,守护智慧女神雅典娜
  |-- void setDaemon(true)设置为守护线程


6. Thread类的toString()方法
  |-- 线程优先级,多核CPU中,效果不是很明显了
  |-- 线程的优先级分为3个当,最低,默认,最高
  |--  void setPriority(int newPriority) 设置线程的优先级


7. Thread类 join方法
  |-- 对线程进行运行时期的设置
  |-- 执行join方法的线程,会一直执行完毕后,其他的线程再来抢夺CPU的资源


8. 线程的让步 Thread类的静态方法 yield()


//1.5后的锁来实现
//定义产品类,鼠标
import java.util.concurrent.locks.*;
class Mouse
{
private String name = "鼠标";
private int count = 0;
    private boolean flag = false;//是false还没有生产
 //建立lock锁对象
    private Lock lock = new ReentrantLock();
//建立Condition对象,对线程进行分组管理
//使用lock接口中的方法 newCondition来获取Condition对象


    Condition pro = lock.newCondition();
    Condition cus = lock.newCondition();


public  void proc(){
//获取锁
lock.lock();
while(flag){
  try{pro.await();}catch(Exception e){}
}
System.out.println(name+" 生产第  "+(++count));
flag = true;
cus.signal();
//释放锁
lock.unlock();
}


public  void cus(){
lock.lock();
while(!flag){
  try{cus.await();}catch(Exception e){}
}
System.out.println(name+"消费第"+count);
flag = false;
pro.signal();
lock.unlock();
}
}




//定义生产者
class Proc implements Runnable
{
private Mouse m;
Proc(Mouse m){ this.m = m;}
public void run(){
 while(true){
    m.proc();
 }
 }

}
//定义消费者
class Cus implements Runnable
{
    private Mouse m;
Cus(Mouse m){ this.m = m;}
public void run(){
 while(true){
    m.cus();
 }
 }

}
class ProductCustomers2
{
public static void main(String[] args) 
{


Mouse m  = new Mouse();
Proc p = new Proc(m);
Cus c = new Cus(m);


new Thread(p).start();
new Thread(p).start();
new Thread(p).start();
new Thread(p).start();
new Thread(p).start();
new Thread(p).start();
new Thread(p).start();
new Thread(p).start();

new Thread(c).start();
new Thread(c).start();
new Thread(c).start();
new Thread(c).start();
new Thread(c).start();
new Thread(c).start();
new Thread(c).start();
new Thread(c).start();
//System.out.println("Hello World!");
}
}


===============================================================================