「唤醒java」唤醒作文
本篇文章给大家谈谈唤醒java,以及唤醒作文对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
java 线程 唤醒问题
首先,从你程序的本意来看, 你是想用线程实现一个生产者-- 消费者模式, 用在馒头的场景, 如下:
1、 肯定需要一个篮子, 负责装馒头,并且这个篮子有容量,假设容量为C;
2、 有两个人,第一个是爹(生产者), 第二个是娃(消费者), 爹负责向篮子中放入馒头, 娃负责从篮子中取出馒头喂狗;
3、 但是篮子的容量是有限的, 当篮子被装满时, 爹就等待娃从篮子中取出馒头,篮子腾出空间之后,爹继续装馒头; 当篮子的馒头都被取走后, 娃就等待, 当篮子中又被放入馒头时,才继续取馒头。
附上代码:
篮子:
public class Bucket {
private int count = 0; // 篮子能够容纳的馒头数
private int total = 0; // 放馒头的总数
public synchronized void put(){
if(count == 5){
try {
System.out.println("俺是他爹,篮子满了,俺在等俺家娃拿馒头喂狗");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count += 1;
total++;
System.out.println("俺是他爹,俺放了一个馒头,现有篮子里有 [" + count + "] 个馒头");
notify();
}
public synchronized boolean get(){
if(count == 0){
try {
wait();
System.out.println("俺是他娃,篮子空了,俺在等俺爹放馒头到篮子里");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count -= 1;
System.out.println("俺拿了一个馒头喂俺家大花狗, 篮子里还有 [" + count + "] 个馒头");
notify();
if(total == 100 count == 0){
return false;
}else{
return true;
}
}
爹:
public class Product implements Runnable{
private Bucket bucket;
Product(Bucket bucket){
this.bucket = bucket;
}
@Override
public void run() {
for(int i=0; i100; i++){
bucket.put();
}
System.out.println("俺把馒头都放完了");
}
}
娃:
public class Consumer implements Runnable{
private Bucket bucket;
public Consumer(Bucket bucket){
this.bucket = bucket;
}
@Override
public void run() {
while(true){
if(!bucket.get()){
break;
}
}
System.out.println("俺家大花狗吃完馒头了");
}
}
启动类:
public class Test {
public static void main(String[] args) {
Bucket bucket = new Bucket();
new Thread(new Consumer(bucket)).start();
new Thread(new Product(bucket)).start();
}
}
最后附上你的问题, notify 由谁来唤醒:
注意 wait() 和 notify() 是Object类上的方法,
notify() 的意思是: 从加锁的对象的监视器(监视器就是锁)的等待队列中, 任意取出一个等待线程, 让该线程处于runnable状态;
wait()的意思是: 把锁住对象的当前线程, 放入到监视器的等待队列中。
所以,notify()的意思就是要唤醒等待队列中的一个等待线程,当程序发起这么一个事件后, 是由虚拟机的线程调度器完成线程状态之间的转换的。
java多线程怎么唤醒特定线程
java使用单纯的wait/notify是无法唤醒指定线程的
一般的做法是修改一个特定标识,然后notifyAll,被唤醒的线程查看该标识是否指定自己处理,是就运行下去,不是就继续wait
还有一种做法是针对每一个线程做一个wait object,要唤醒哪一个就notify哪一个object就行了,但是能不能这样做去取决于你的业务需求
JAVA虚假唤醒问题?
比如这个代码
synchronized (queue) {
if (queue.isEmpty()) {
queue.wait();
}
queue.remove();
}
由于wait方法会释放锁,假设消费者线程c1处于wait这里,锁已经释放,生产者线程p先锁住queue,添加了一个元素,并notifyAll,这时c1唤醒,执行删除。而c1唤醒的同时,消费者线程c2也进入了,发现isEmpty是false,不等待,也跑去删,就会抛异常。
换成while就不会有这个问题。
java 多线程子线程唤醒主线程问题
设一个三个线程的共享对象o
a.start();
b.start();//启动子线程
主线程中
o.wait(10*1000);//主线程中等10秒
同时A、B中各有一个执行完的通知
a或b的run(){
.....
o.
notify();
}
基本的线程操作...
关于唤醒java和唤醒作文的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。