当前位置: 首页 > 知识库问答 >
问题:

同步和通知执行顺序和范围

通俊发
2023-03-14
public class Process {

public void produce( ) {
  synchronized(this) {
   // do stuff
    wait( );
     System.out.println("Done");
    }
}


public void consume( ) {
    synchronized(this) {
    // stuff
    notify(); 
    Thread.sleep(5000);
    }
}
}

共有1个答案

叶文博
2023-03-14

您可以编写一个简单的程序来测试这个

public static void main(String[] args) throws Exception {
    final Process e = new Process();        
    Thread t = new Thread(new Runnable() {          
        @Override
        public void run() {
            try {
                Thread.sleep(10);
                e.consume();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    });
    t.start();
    e.produce();
}

此程序等待5000毫秒并打印

Done

关于你的问题

因此,不,线程在调用notify()时不会放弃对锁的控制。当代码退出synchronized块时,就会发生这种情况。

2)另外,如果我有第三个同步的方法/线程,它不等待或通知,只是运行,我能预先预测我的操作执行的顺序吗?

你可以估计,但不能确定。执行由线程调度程序决定。

3)最后,notify()如何知道要“唤醒”什么线程?

电话不知道。线程调度程序知道并选择。你无法控制这一切。

wait()notify()状态javadoc

因此,只有当您位于在对象上同步的synchronized块内时,才能对该对象调用它们。

在您的代码示例中,调用

wait();

正在隐式地执行

this.wait();
 类似资料:
  • 问题内容: 我整天都在整理此问题,希望有人能帮助您确定我的问题。我已经使用Ajax在我的应用程序中创建了“异步进度回调”类型的功能。当我将功能剥离到测试应用程序中时,我得到了预期的结果。见下图: 所需功能 当我使用相同的代码将功能绑定到我的单页应用程序中时,出现了一种阻塞问题,其中所有请求仅在最后一个任务完成后才得到响应。在测试应用程序中,所有请求均会依次响应。服务器报告所有请求的状态(“待定”)

  • 问题内容: 我有一个抽象基类,用作我的单元测试(TestNG 5.10)的基础。在该类中,我将初始化测试的整个环境,设置数据库映射等。此抽象类具有一个带有注释的方法,该方法可以进行初始化。 接下来,我用具有方法和方法的特定类扩展该类。这些方法对环境进行类特定的初始化(例如,将一些记录放入数据库中)。 如何执行带注释的方法的特定顺序?我需要先执行抽象基类中的那些,然后再执行扩展类中的那些。 例: 预

  • 本文向大家介绍setTimeout和Promise的执行顺序?相关面试题,主要包含被问及setTimeout和Promise的执行顺序?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 首先我们来看这样一道题: 输出答案为2 10 3 5 4 1 要先弄清楚settimeout(fun,0)何时执行,promise何时执行,then何时执行 settimeout这种异步操作的回调,只有主线程

  • 问题内容: 在HTML页面中包含JavaScript的方法有很多。我知道以下选项: 内联代码或从外部URI加载 包括在或标记[ [1],[2] ] 没有属性或属性(仅外部脚本) 包含在静态源中或由其他脚本动态添加(处于不同的解析状态,具有不同的方法) 不计算硬盘中的浏览器脚本,javascript:URI和-attributes [[3] ],已经有16种方法可以使JS执行,我敢肯定我忘了一些东西

  • 我有一份由不同的工作组成的工作。我希望在其他作业步骤完成后,一起触发一批这些作业步骤(JobStep1、JobStep2、JobStep3)(在不同的线程中与AsyncTaskExecutor一起运行)和最后一个作业步骤(JobStep4)。因此,我为每个JobStep创建了不同的流,并用AsyncTaskExecutor将它们放在一个流中。我还为最后一个JobStep做了一个单独的流。 完成工作

  • 问题内容: 在Java8中运行以下流示例: 产量: 当然-这并不奇怪。由于http://docs.oracle.com/javase/8/docs/api/index.html?overview- summary.html ,流是顺序执行还是并行执行都没有关系: 除了标识为明确不确定的操作(例如findAny())之外,流是顺序执行还是并行执行都不应该更改计算结果。 AFAIK 是确定性的并且是关