「唤醒java」唤醒作文

博主:adminadmin 2023-03-18 02:33:07 675

本篇文章给大家谈谈唤醒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和唤醒作文的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。