终止即将进入等待同步资源状态的线程

薇琪

我有一个预定的方法调用,它在预定的时间调用以下方法:

private void doSomething(Map<String, String> someArguments) throws CustomException {
  MyEnum runType = getRunType(someArguments);
  switch (runType) {
        case FRUIT:
             new FruitClass().workNow();
             break;

        case VEGETABLE:
             new VegetableClass().workNow();
             break;

        default:
            // log that the type is not known 
      }
   }

的方法签名workNow是这样的:

workNow() throws CustomException

workNow方法运行几分钟并做一些工作。我的问题是,当一个workNowfor FRUIT(or VEGETABLE) 正在进行并且另一个调用发生在相同类型(FRUIT例如)时,它创建了一个新FruitClass实例并开始workNow并行执行它

我将其解决为:

private void doSomething(Map<String, String> someArguments) {
    MyEnum runType = getRunType(someArguments);
    switch (runType) {
        case FRUIT:
            synchronized (FruitClass.class){
                new FruitClass().workNow();
            }
            break;

        case VEGETABLE:
            synchronized (VegetableClass.class){
                new VegetableClass().workNow();
            }
            break;

        default:
            // log that the type is not known 
    }
}

这个问题的答案

这工作正常。但是它在同步类上构建了一个等待线程的队列,只要前一个线程释放它就获取锁。

只是为了增强我的知识,有没有办法确定当一个线程进入并看到类上的锁时,而不是进入等待,它只是被终止。

换句话说,“我来这里是为了做workNow。让我锁定FruitClass。哦!其他线程已经拥有锁定并且正在做workNow。我不需要做任何事情。终止。”

如何在这里实现这一目标?

编辑1:

从下面的答案:

final Lock reentrantLock = new ReentrantLock();

private void doSomething(Map<String, String> someArguments) {
    MyEnum runType = getRunType(someArguments);
    switch (runType) {
        case FRUIT:
            if(reentrantLock.tryLock()) {
               try {
                   new FruitClass().workNow();
                } finally {
                   reentrantLock.unlock();
                }
            } else {
              // do nothing and terminate
            }
            break;

        case VEGETABLE:
            synchronized (VegetableClass.class){
                new VegetableClass().workNow();
            }
            break;

        default:
            // log that the type is not known 
    }
}

但是,这显然不会起作用。因为这只会实例化 new FruitClass,调用 process 并释放锁。

正如我最初的问题所说,我想锁定新对象本身的创建,如果一个对象已经创建并且正在执行workNow.

我如何使用锁实现这一点?

我不知道这样的事情是否可能:

final Lock reentrantLock = new ReentrantLock(FruitClass.class);
马克·布拉姆尼克

如果我的问题是正确的,那么您将使用更多“细粒度”的方法来处理 Java 同步。使用“同步”不仅足够灵活。

解决这个问题的一种方法是使用java.util.concurrent.locks提供的锁

Locks 特别是提供tryLock方法,它只是尝试获取锁,但如果它已经被另一个线程拥有它就不会进入临界区,您可以尝试一段时间或立即继续,API 是灵活的足以允许它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何杀死正在等待同步资源的线程?

来自分类Dev

同步线程以等待多个线程

来自分类Dev

等待线程资源消耗

来自分类Dev

为什么线程在无限时间内不进入等待状态?

来自分类Dev

互斥锁是否会使等待线程在POSIX API中进入睡眠状态?

来自分类Dev

C#等待,不要使线程进入睡眠状态并冻结程序。

来自分类Dev

在同步块中等待线程

来自分类Dev

在同步块中等待线程

来自分类Dev

同步从UI线程对资源的访问

来自分类Dev

线程池处于等待状态

来自分类Dev

为什么线程进入WaitSleepJoin状态?

来自分类Dev

关于让inotify线程进入睡眠状态

来自分类Dev

使主线程进入睡眠状态

来自分类Dev

使用相同资源的Java非同步线程

来自分类Dev

Ruby:编辑线程程序以在终止时进入功能

来自分类Dev

如果行不是空白终止,stringstream进入失败状态

来自分类Dev

进入终止状态时,AWS云形成环境无法启动

来自分类Dev

线程安全,无需同步可变状态

来自分类Dev

没有等待线程的信号状态

来自分类Dev

多个线程不能同时进入同步块吗?

来自分类Dev

当Android即将锁定屏幕/进入睡眠状态时执行应用程序

来自分类Dev

使用增强线程:发信号并等待终止

来自分类Dev

如何等待多个线程在delphi中终止?

来自分类Dev

使用Monitor进入/退出,等待/脉冲,锁定的多线程

来自分类Dev

HttpRequest操作时,应用程序进入“等待状态”

来自分类Dev

通过同步锁定由最短的等待线程获取

来自分类Dev

等待线程是否重新访问同步方法中的代码

来自分类Dev

同步,锁定和等待阻止主UI线程

来自分类Dev

通过同步锁定由最短的等待线程获取

Related 相关文章

热门标签

归档