|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
多线程间通信
1、等待/通知机制
一个线程需要知道另一个线程是否完成,才能判断它是否要执行,处于等待状态
另一个线程完成后通知一个线程 ,告诉它完成了 执行通知动作
wait():使线程停止运行
过程:
wait()方法使当前执行代码的线程进行等待,wait()方法使object类的方法,
该方法将当前线程置入“预执行队列”中,并且在wait()所在的代码行出停止执行,直到接到通知或被中断为止
条件:调用wait方法前,线程必须获得该对象的对象级别锁,即只能在同步方法或同步模块中调用wait方法,如果调用wait()没有持有适当的锁,则抛出IllegalMonitorStateException,它是RuntimeException的一个子类,因此不需要try-catch语句进行捕捉异常
notify():是停止的线程继续运行
过程:
notify同样需要在同步方法或者同步模块中调用,即在调用该线程必须获得对象的对象级锁,如果调用notify时没有持有适当的锁,则抛出IllegalMonitorStateException (RuntimeException的一个子类)
当有多个线程等待该对象的对象锁时,则由线程规划器随机挑选出其中一个wait状态的线程,对其发出通知notify,并使它等待获得该对象的对象锁。
注意:在执行notify()后,当前线程不会马上释放该对象锁(wait执行完立马释放,sleep方法不释放),必须等到执行notify方法的线程将程序执行完,退出synchronized代码块后,当前线程才会释放锁
当第一个获得该对象锁的wait线程运行完毕后,它会释放该对象锁,此时如果当对象没有再次使用notify语句,则该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的通知,还会继续阻塞在wait状态,直到这个对象发出一个notify或者notifyAll
如果对象只是作为括号参数 可直接写 不必声明
但是其他情况需要声明 例如在方法内部调用
notifyAll()为随机唤醒wait状态线程
方法wait(long)的使用
等待一定时间内是否有线程对锁进行唤醒,超过这个时间则自动唤醒
运用sleep时一定要有try-catch或者类继承InterruptedException类
运用Thread类时可以 类继承 也可以在主类中用Thread对象绑定没有继承Thread的类对象,达到使用多线程目的
生产者模式/消费者模式
生产者-消费者模式 :操作值
生产者 自检变量是否为空,有则等待wait,等消费者notify
执行赋值,并notify消费者
消费者 自检变量是否赋值,空则wait, 等待生产者notify
执行输出,并清空变量值
多生产与多消费:假死现象 线程进入waiting等待状态
getThreadGroup() 返回该线程所属的线程组
activeCount() 返回当前线程的线程组中活动线程的数目
enumerate(Thread[] tarray) 将当前线程的线程组及子组中的每一个活动线程复制到指定的数组中 tarray-要复制到的线程对象数组
作用:将线程对象数组转为可枚举的数组,就可以用foreach()循环输出
如果不是使用enumerate(Thread[] tarray),要输出线程对象数组可以用for循环输出
接口和抽象不能实例化,但是他们可以创建一个指向自己的的对象引用,他们的实现类(接口的实现类,实现接口里的方法)或者子类在充当这样的角色
List a=new ArrayList();
则a拥有List的所有属性和方法,不会拥有其实现类Arraylist的独有的属性和方法
如果List与ArrayList中有相同的属性(如int i),有相同的方法(如void f()),
则a.i调用了List中的i,
a.f()是调用了ArrayList中的f();
|
评分
-
查看全部评分
|