gpt4 book ai didi

Java - 线程+ Action

转载 作者:行者123 更新时间:2023-12-03 18:06:38 25 4
gpt4 key购买 nike

我是 Java 的新手,所以我有一个简单的问题,我不知道从哪里开始 -我需要写一个接受Action的函数,在多线程程序中,只有第一个进入函数的线程做这个 Action ,其他所有线程都等他完成,然后不做就从函数中返回任何东西。

正如我所说 - 我不知道从哪里开始,因为,首先 - 函数中没有静态变量(如 c/c++ 中的静态),那么我如何才能使只有第一个线程启动操作,而其他线程什么都不做?第二 - 对于要等待的线程,我应该使用

public synchronized void lala(Action doThis)
{....}

或者我应该在函数内部写一些类似的东西

synchronized (this)
{
...
notify();
}

谢谢!

最佳答案

如果您希望到达某个方法的所有线程都等待第一个方法,那么它们必须在一个公共(public)对象上同步。它可以是调用方法的同一个实例 (this),也可以是任何其他对象(显式锁定对象)。

如果您想确保第一个线程是唯一执行该操作的线程,那么您必须将此事实存储在某个地方,供所有其他线程读取,因为它们将执行相同的指令。

根据前两点,可以锁定这个“事实”变量以达到预期的结果

static final AtomicBoolean flag = new AtomicBoolean(false); // synchronize on this, and also store the fact. It is static so that if this is in a Runnable instance will not appear to reset the fact. Don't use the Boolean wrapper, for the value of the flag might be different in certain cases.

public void lala(Action doThis)
{
synchronized (flag) // synchronize on the flag so that other threads arriving here, will be forced to wait
{
if(!flag.get()) // This condition is true only for the first thread.
{
doX();
flag.set(true); //set the flag so that other threads will not invoke doX.
}
}
...
doCommonWork();
...
}

关于Java - 线程+ Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6246302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com