黑马程序员_多线程2

------- <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!");
}
}


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


黑马程序员多线程练习题主要包括两个问题。第一个问题是如何控制四个线程在打印log之前能够同时开始等待1秒钟。一种解决思路是在线程的run方法中调用parseLog方法,并使用Thread.sleep方法让线程等待1秒钟。另一种解决思路是使用线程池,将线程数量固定为4个,并将每个调用parseLog方法的语句封装为一个Runnable对象,然后提交到线程池中。这样可以实现一秒钟打印4行日志,4秒钟打印16条日志的需求。 第二个问题是如何修改代码,使得几个线程调用TestDo.doSome(key, value)方法时,如果传递进去的key相等(equals比较为true),则这几个线程应互斥排队输出结果。一种解决方法是使用synchronized关键字来实现线程的互斥排队输出。通过给TestDo.doSome方法添加synchronized关键字,可以确保同一时间只有一个线程能够执行该方法,从而实现线程的互斥输出。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [黑马程序员——多线程10:多线程相关练习](https://blog.csdn.net/axr1985lazy/article/details/48186039)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值