爪哇2博客
爪哇2博客

爪哇中notify和notifyAll之间的区别

In 这个 post, we are 去 至 see difference 是tween 通知 and 通知all in 爪哇.

通知():

你打电话的时候 通知 对象的方法,它唤醒以下对象之一 线 等待那个对象。因此,如果有多个线程在等待一个对象,它将唤醒其中之一。现在,您一定想知道它将唤醒哪一个。它实际上取决于OS的实现。

通知All():

通知All会唤醒所有在该对象上等待的线程,而不是notify只会唤醒其中一个。
让我们借助示例了解它:
1.创建一个名为File.java的类:
它是Java 是an类,线程将在该Java 是an类上进行操作并调用wait和notify方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
组织.Arpit.爪哇2blog.线;
 
上市 文件 {
 
名称;
布尔值 完成了;
 
上市 文件( 名称) {
();
这个.名称 = 名称;
}
 
上市 getName() {
返回 名称;
}
上市 虚空 setName( 名称) {
这个.名称 = 名称;
}
上市 布尔值 完成了() {
返回 完成了;
}
上市 虚空 setCompleted(布尔值 完成了) {
这个.完成了 = 完成了;
}
 
}
 

2.创建一个名为FileReader.java的类
该线程将等到其他线程调用notify方法,然后再完成其处理。它首先要锁定文件对象,然后从同步块中调用它。因此在本示例中,它将等待FileWriter完成文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
组织.Arpit.爪哇2blog.线;
 
上市 文件阅读器 实施 可运行{
 
文件 文件;
 
上市 文件阅读器(文件 文件) {
  ();
  这个.文件 = 文件;
}
 
@覆写
上市 虚空 () {
  已同步 (文件) {
   系统..打印(线.currentThread().getName()+“正在等待文件完成:”+文件.getName());
   尝试 {
    文件.等待();
   } 抓住 (InterruptedException e) {    
    e.printStackTrace();
   }
   系统..打印(线.currentThread().getName()+“:文件已经完成!!您可以阅读它”);
  }
}
 
}
 

3.创建一个名为FileWriter.java的类
此类将通知正在等待文件对象的线程(如果需要通知)。一旦调用notify,它将不会放弃锁,它首先完成其同步块。因此,在此示例中,FileWriter将完成文件并将其通知给FileReaders。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
组织.Arpit.爪哇2blog.线;
上市 文件Writer 实施 可运行{
 
文件 文件;
 
上市 文件Writer(文件 文件) {
  ();
  这个.文件 = 文件;
}
 
@覆写
上市 虚空 () {
  已同步 (文件) {
   系统..打印(“ 写将开始写入文件:” +文件.getName() );
   尝试 {
    线.睡觉(1000);
   } 抓住 (InterruptedException e) {
    e.printStackTrace();
   }
   文件.setCompleted(真正);
   系统..打印(“文件已完成”);
 
   文件.通知();
   系统..打印(“通知一位读者”);
 
  }
}
}
 

4.创建一个类NotifyAndNotifyAllMain,java。
这是我们的主类,它将创建上述类的对象并运行它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
组织.Arpit.爪哇2blog.线;
 
上市 NotifyAndNotifyAllMain {
 
上市 静态的 虚空 主要( args[])
{
  //将在其上调用wait和notify方法的文件对象
  文件 文件= 文件(“ 电子表格文件”);
  文件阅读器 阅读器1= 文件阅读器(文件);
  文件阅读器 阅读器2= 文件阅读器(文件);
 
  // 文件阅读器线程,它将等待文件完成
  线 线程1= 线(阅读器1,“读者1”);
  线 线程2= 线(阅读器2,“读者2”);
 
  线程2.开始();
  线程1.开始();
 
  //确保两个阅读器都开始等待文件
  尝试 {
   线.睡觉(3000);
  } 抓住 (InterruptedException e) {
 
   e.printStackTrace();
  }
  // 文件Writer线程,一旦文件完成,它将通知
  文件Writer 文件Writer= 文件Writer(文件);
  线 文件WriterThread= 线(文件Writer);
  文件WriterThread.开始();
}
}
 

在notify()的情况下:
当您运行上述程序时,将获得以下输出:

1
2
3
4
5
6
7
8
 
读者 2 等候 对于 文件 已完成: 电子表格 文件
读者 1 等候 对于 文件 已完成: 电子表格 文件
开始 写作 文件 : 电子表格 文件
文件 拥有 已完成 现在
通知 读者
读者 2: 文件 拥有 已完成 现在!! 能够
 

因此,这里有两个FileReader线程(读取器1和读取器2)正在等待文件完成,因此它们称为file.wait()。一旦FileWriter完成’的文件,它称为file.notify(),并且Reader 2线程启动并完成其处理。
如果是notifyAll():
让我们更改FileWriter类以调用file.notifyAll()。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
组织.Arpit.爪哇2blog.线;
上市 文件Writer 实施 可运行{
 
文件 文件;
 
上市 文件Writer(文件 文件) {
  ();
  这个.文件 = 文件;
}
 
@覆写
上市 虚空 () {
  已同步 (文件) {
   系统..打印(“ 写将开始写入文件:” +文件.getName() );
   尝试 {
    线.睡觉(1000);
   } 抓住 (InterruptedException e) {
    e.printStackTrace();
   }
   文件.setCompleted(真正);
   系统..打印(“文件已完成”);
 
   文件.通知All();
   系统..打印(“通知所有读者”);
 
  }
}
}
 

当您运行上述程序时,将得到以下输出:

1
2
3
4
5
6
7
8
9
 
读者 2 等候 对于 文件 已完成: 电子表格 文件
读者 1 等候 对于 文件 已完成: 电子表格 文件
开始 写作 文件 : 电子表格 文件
文件 拥有 已完成 现在
通知 所有 读者群
读者 1: 文件 拥有 已完成 现在!! 能够
读者 2: 文件 拥有 已完成 现在!! 能够
 

在notifyAll()的情况下,它会通知所有正在等待该对象的线程。

导入联系人

您可能还喜欢:

分享这个

作者

关注作者

相关文章

  • 获取Java中的线程ID
    9月30日

    获取Java中的线程ID

    在本文中,我们将学习获取Java中正在运行的线程的线程ID。 Id是在线程创建时生成的唯一正数。该ID在线程的生存期内保持不变。线程终止时,其ID可用于引用另一个线程,但是[…]

  • 爪哇中的ArrayBlockingQueue
    9月19日

    爪哇中的ArrayBlockingQueue

    在本文中,我们将了解Java并发队列BlockingQueue。然后我们将深入其中’其中之一的实现ArrayBlockingQueue。什么是BlockingQueue 阻塞队列接口是在Java 5中并发API下引入的,它表示一个线程安全的队列,可以在其中添加和删除元素。我们可以有 […]

  • 将Java程序延迟几秒钟
    12月11日

    将Java程序延迟几秒钟

    在这篇文章中,我们将看到如何将Java程序延迟几秒钟。在很多情况下,我们需要等待其他任务完成,因此我们需要延迟Java程序。有多种方法可以延迟Java程序的执行。使用Thread.sleep 睡觉方法会使当前线程暂停[…]

  • 29 May

    如何使用Java中的线程打印偶数和奇数

    在本文中,我们将看到如何使用Java中的线程打印偶数和奇数。另请参见:如何在Java中使用3个线程打印序列问题您将获得两个线程。您需要使用一个线程打印奇数,而使用另一线程打印偶数。您需要以自然顺序打印[…]

  • 爪哇中的wait(),notify()和notifyAll()
    10月22日

    为什么在对象类中使用wait(),notify()和notifyAll()方法

    在这篇文章中,我们将看到为什么wait(),notify()和notifyAll()方法在对象类中而不在线程类中。这是最常问到的Java多线程面试问题之一。您可能知道wait(),notify()和notifyAll()方法在Object类中,您知道相同的原因吗?让’s […]

  • 爪哇中的自定义BlockingQueue
    10月16日

    爪哇中的自定义BlockingQueue实现

    在本文中,我们将看到如何创建自己的自定义BlockingQueue。这是最常被问到的Java面试问题之一。您需要实现自己的BlockingQueue。这个问题有助于面试官对多线程概念有所了解。这是BlockingQueue的简单实现。我们将使用数组将元素存储在[…]

Comments

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

订阅我们的新闻

获取质量教程到您的收件箱。现在订阅。


成为朋友

©2020 爪哇2博客