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

Java中没有等待的线程

王俊哲
2023-03-14

我对Java线程和并发有点陌生。我读过关于同步和锁定块的书。它们让其他线程等待第一个线程完成其工作。

我只想知道一种方式,如果线程a正在执行它的执行,那么线程B不应该等待并跳过共享代码块的执行。

共有2个答案

毛博
2023-03-14

我只想知道一种方式,如果线程a正在执行它的执行,那么线程B不应该等待并跳过共享代码块的执行。

您可以使用Lock.tryLock()的两个变体,一个尝试立即锁定,另一个等待给定周期:

final Lock lock = new ReentrantLock();
new Thread(() -> {
   boolean isAcquired = lock.tryLock();
   System.out.println(Thread.currentThread().getName() + " acquired lock " + isAcquired);
   sleep(10000); //acquires the lock and sleeps for 10 secs
}, "Thread A").start();

sleep(1000); //main thread sleep so that Thread A locks on the lock

new Thread(() ->{
  try {
      //will wait for 2 secs tops to acquire the lock
      boolean isAcquired = lock.tryLock(2000, TimeUnit.MILLISECONDS);
      System.out.println(Thread.currentThread().getName() + " acquired lock " + isAcquired);
  }catch(InterruptedException ie){
      ie.printStackTrace();
  }
}, "Thread B").start();

输出:

Thread A acquired lock true
Thread B acquired lock false

在第一次使用中,tryLock()不会等待,如果可以,它会尝试获取锁。它将立即返回true,否则将返回false

在第二次使用中,tryLock(long time,TimeUnit)将等待锁在指定的time期间释放,然后获取锁并返回true,否则如果被中断,它将返回false或抛出InterruptedException

牧宁
2023-03-14

线程B可以尝试通过Lock.tryLock获取锁。如果它不可用,线程B可以在检查后立即跳过“该共享代码块的执行”。

 类似资料:
  • 问题内容: 我正在尝试用Java倒计时。 这是我的HTML 而我的JS: 但是由于某种原因,它不会等待超时时间,而是立即执行,以便在刷新页面时立即显示“完成”。我知道它实际上被执行了多次,因为如果我这样做,它会从45开始递减计数。为什么会绕过超时? 问题答案: 执行带有该参数的函数,并将结果传递给。你不要那样 相反,执行一个匿名函数来调用您的函数:

  • 问题内容: 我有以下情况: 为了运行算法,我必须运行多个线程,并且每个线程都会在死之前设置一个实例变量x。问题是这些线程不会立即返回: 我应该使用等待通知吗?还是我应该嵌入一个while循环并检查是否终止? 感谢大家! 问题答案: 创建一些共享存储来保存每个线程的值,或者如果足够的话,只存储总和。使用a 等待线程终止。每个线程完成后都会调用,您的方法将使用该方法来等待它们。 编辑: 这是我建议的方

  • 我正在为一个已经存在的应用程序构建一个API,它有时会使用线程。所以我的方法是这样的 现在,方法可能会产生一个线程,但不一定。如果是这样,将执行其余代码,而新线程正在执行其他代码。我需要的是一种等待完成执行其所有子线程的方法,然后再进入下一行代码。我没有可能运行的线程的引用,因为这是基于用户的选择,所以我不能使用。我也不能编辑应用程序(或中发生的事情)。

  • 嗨,我正在做一个项目,我已经达到了我非常困的部分。我试图寻找方法来学习如何在繁忙的等待中编写 while 循环,但我没有找到任何东西,我的代码只是作为无限循环运行。有人可以帮助我解释一个繁忙的等待循环应该如何工作,并帮助我打破这个无限循环吗? 该项目希望做到以下几点:早上,学生醒来后(这需要一段随机的时间),他会去洗手间为新的上学日做准备。如果浴室已经客满,学生需要Rest一下(使用yield()

  • 我有一段代码 如您所见,我首先将标志设置为false,这样其中一个线程就可以进入Sum2Elements方法并将其更改为true,从而让所有人都等待。 我知道在同步代码中,只有一个线程可以完成它的任务,这里我有两个同步方法,这是否意味着两个线程在每次通知之后都在尝试执行这个方法? 如果是这样,那么一个线程是否不可能输入Sum2Elements,在另一个线程进入InsertElement之前将标志更

  • 我想在C#中处理子目录和文件的文件系统/文件夹。我正在使用TPL库中的任务。这个想法是递归地执行它并为每个文件夹创建一个任务。主线程应该等待子线程完成,然后打印一些信息。事实上我只是想知道扫描何时完成。我已经开始使用线程池,然后切换到TLP。做了一些简单的例子。经过一些尝试从简单的代码到越来越臃肿的代码我被困在这里: 主线程有时仍然过早地继续,而不是在完成所有其他线程之后继续。(我对C#比较陌生,