繁体   English   中英

在同步代码块中调用Java Timer

[英]Calling java timer in a synchronized block of codes

如果我有一个称为A的父代码块,则A被同步。 在A中,我执行了一个称为B的代码子块。我是否也认为B也将被同步?


如果在AI中有一个计时器在一定的t时间内延迟B的执行,那么当A已经完成时,是否有可能B在以后执行?


非常感谢你。


P / S:对不起,不清楚的代码,这就是它的外观

   synchronized  A{
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
      @Override
      public void run() {
        B block
      }
    }, 2*60*1000);

    } 

要看。 如果块B是这种方法中的代码块,则可以...它将被同步。

public synchronized void methodA() {
    // Block B
    {
       // some code
    }
}

如果是如下所示的另一种方法,则否:

public synchronized void methodA() {
    methodB();
}

public void methodB() {
    // Block B code
    // Nothing prevents an unsynchronized method from calling this method
    //   at same time as methodA() holds  lock on `this` object
}

除非methodB也被标记为已synchronized 已从另一个同步方法(例如, public synchronized methodC()public synchronized methodC() 或使用了另一个同步机制,否则methodB()将不会同步。

这些只是最简单的情况。 你已经开发布示例的代码,因为“块”没有很好默认定义和同步锁的类型(关于隐式更好this通过同步方法与明确的对象锁)有差别。

但是,您的最后一行听起来像是您在询问同步执行代码还是异步执行代码,尽管与线程和synchronized块有关,但这是一个不同的概念。

在那种情况下,这取决于在block A发生的事情……如果创建了新的线程来执行block B那么在代码执行的时间上可能发生任何事情。 如果没有创建线程,则可以安全地假设block Ablock B之前不会完成。

编辑:基于现在发布的代码...同步的A block将仅确保一次创建Timer线程。 但是,除非Java Timer框架有什么特别之处,否则没有什么可以阻止两个线程在run方法中同时执行B block的…所以确保内容是线程安全的。

也就是说,不要仅仅因为在相同的延迟下在同步块中创建了Timer不同实例,就不会假设它们不会同时进入run方法。 如果B block访问外部的非线程安全代码(例如,静态方法,磁盘访问),您可能会感到惊讶。

正如Amm Sokun在其他答案中提到的那样, A{}将在Block B执行之前返回。

块B将在A完成执行后执行,这是因为在方法A中,您只是将B调度为在2*60*1000毫之后运行,而计时器将在2*60*1000毫之后执行B

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM