问题标签 [phaser]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1202 浏览

java - Phaser - 如何将其用作 CountDownLatch(1)?

我知道我可以简单地CountDownLatch直接使用,但是,作为练习并且为了Phaser更好地理解,我想使用它而不是COuntDownLatch.

因此,我将创建 N 个等待者,以及一个需要翻转闩锁的线程。所有等待者,如果在翻转之前到达,将阻塞,但是在锁存器倒计时之后,所有后续的await()立即返回。

Phaser不知道如何实现这一点......屏障很容易,因为我们有 N + 1 个线程,每个线程都在等待。然而,为了确保在第一阶段之后没有线程将等待,不知何故让我望而却步。

我能想出的唯一方法,不是很好,如下:

另一个线程只是将移相器推进到下一个阶段。这并不理想,因此任何指针都会受到赞赏。

0 投票
1 回答
178 浏览

java - 将线程注册到 Phaser

我正在学习Phaser。在这样做的过程中,我遇到了一个问题。下面是我的代码,

上述样本测试

执行上述程序后,输出为:

注册后:t3,时间=22:01:26.636,注册=1,到达=0,未到达=1,阶段=0。

注册后:t2,时间=22:01:26.636,注册=1,到达=0,未到达=1,阶段=0。

注册后:t1,时间=22:01:26.636,注册=1,到达=0,未到达=1,阶段=0。

在等待 0::t3 之前,时间=22:01:28.728,注册=1,到达=0,未到达=1,阶段=0。

在等待 0::t2 之前,时间=22:01:28.728,注册=1,到达=0,未到达=1,阶段=0。

在等待 0::t1 之前,时间=22:01:28.728,注册=1,到达=0,未到达=1,阶段=0。

在提前 0::t1 之后,时间=22:01:28.728,注册=1,到达=0,未到达=1,阶段=3。

提前0::t2后,时间=22:01:28.728,注册=1,到达=0,未到达=1,阶段=3。

在提前 0::t3 之后,时间=22:01:28.729,注册=1,到达=0,未到达=1,阶段=3。

在等待 1::t2 之前,时间=22:01:30.730,注册=1,到达=0,未到达=1,阶段=3。

在等待 1::t3 之前,时间=22:01:30.730,注册=1,到达=0,未到达=1,阶段=3。

在提前 1::t2 之后,时间=22:01:30.730,注册=1,到达=0,未到达=1,阶段=4。

在提前 1::t3 之后,时间=22:01:30.732,注册=1,到达=0,未到达=1,阶段=5。

在等待 1::t1 之前,时间=22:01:30.730,注册=1,到达=0,未到达=1,阶段=3。

在提前 1::t1 之后,时间=22:01:30.732,注册=1,到达=0,未到达=1,阶段=6。

您可以看到这里有很多差异。线程不是按顺序推进的。此外,很少有阶段丢失或/和不按顺序排列。

当我将代码 this.phaser.register() 从构造函数移动到 run 方法的开头时,输出为:

注册后:t1,时间=22:10:58.230,注册=3,到达=0,未到达=3,阶段=0。

注册后:t3,时间=22:10:58.230,注册=3,到达=0,未到达=3,阶段=0。

注册后:t2,时间=22:10:58.230,注册=3,到达=0,未到达=3,阶段=0。

在等待 0::t2 之前,时间=22:11:00.314,注册=3,到达=0,未到达=3,阶段=0。

在等待 0::t1 之前,时间=22:11:00.314,注册=3,到达=0,未到达=3,阶段=0。

在等待 0::t3 之前,时间=22:11:00.314,注册=3,到达=0,未到达=3,阶段=0。

提前0::t2后,时间=22:11:00.315,注册=3,到达=0,未到达=3,阶段=1。

提前0::t3后,时间=22:11:00.315,注册=3,到达=0,未到达=3,阶段=1。

提前0::t1后,时间=22:11:00.315,注册=3,到达=0,未到达=3,阶段=1。

在等待 1::t1 之前,时间=22:11:02.319,注册=3,到达=0,未到达=3,阶段=1。

在等待 1::t2 之前,时间=22:11:02.319,注册=3,到达=0,未到达=3,阶段=1。

在等待 1::t3 之前,时间=22:11:02.319,注册=3,到达=0,未到达=3,阶段=1。

在提前 1::t3 之后,时间=22:11:02.320,注册=3,到达=0,未到达=3,阶段=2。

在提前 1::t2 之后,时间=22:11:02.320,注册=3,到达=0,未到达=3,阶段=2。

在提前 1::t1 之后,时间=22:11:02.321,注册=3,到达=0,未到达=3,阶段=2。

这看起来好多了,线程执行和阶段是按顺序排列的。

以下是我的问题:

1) 为什么在 Runnable 的构造函数中注册方时会有很多差异?

2) 在第二个结果中,到达和未到达的统计数据在每个阶段都为零(不正确)。那么,如何为他们获取正确的数字呢?

任何帮助表示赞赏。

0 投票
1 回答
164 浏览

java - Phaser 相位值转义

给定一个具有初始化 Phaser 的 main 方法的类,并创建(比如说)3 个线程来计算同一个 Phaser 上的阶段。

该代码适用于大多数执行,并产生如下输出,

但是对于一些奇怪的执行,它会产生如下输出

我不确定这是否可以成功复制,因为这种情况很少发生。否则想知道是什么错误导致了这种情况。
声明: Phaser 的初学者

0 投票
0 回答
55 浏览

java - 使用 ThreadPool 的 Phaser 未正确到达并等待。我怎样才能解决这个问题?

可以在此处找到有关如何使用 Phaser 和遇到的问题的基本概念的 repo:https ://github.com/hipy/phaser/tree/master/src

我一直致力于使用 Phaser 使用 ThreadPools 使 Dijkstra 算法更高效。我用一个循环进行了很多迭代,每次迭代都需要一个 Phaser 来等待 ThreadPool 中的线程完成,然后再继续当前的迭代。

我遇到了一个问题,Phaser 没有正确等待。当我使用 ArriveAndDeregister() 时,Phaser 在每个线程完成后进入终止状态。当我调用 Arrive() 时,未到达方的数量不会减少,因此迭代会卡住。

下面的所有代码都在一个调用一次的 apply() 方法中运行。

下面的代码为要执行的线程创建任务。

下面的代码在 for 循环中为每次迭代执行。在这种情况下,有 30.000 次迭代:

跳过一些算法代码,在 for 循环中执行以下代码,启动线程并等待它完成:

输出如下:

第一阶段执行,进行完整的迭代。第二阶段卡住了。未到达的派对数量为 6。3 个新派对和显然 3 个旧派对,即使我调用了 phaser.arrive() 也没有注册为到达。ArriveAndAwaitAdvance() 也没有等待,因为在下一次迭代中有 6 个未到达方而不是 3 个。

我尝试使用到达AndDeregister() 但这会导致阶段终止(阶段计数有一个很大的负值)。

我怎么能解决这个问题?我不想终止一个阶段,但我确实想在每次迭代时将各方注册为到达。

谢谢!

0 投票
0 回答
123 浏览

java - 用 CompletableFuture 替换 Phaser

我有一堆方法在使用Phaser(总是有 1 方),我可以通过使用来替换每种方法CompletableFuture。结果是一样的。使用时有什么隐藏的好处CompletableFuture吗?

例如:

带有 CompletableFuture 的版本 1:

带有 Phaser 的版本 2:

我应该更喜欢哪一个,为什么?哪一个在内存/线程池/等方面表现更好。

0 投票
1 回答
113 浏览

java - java移相器中的多个到达()

假设所有线程都在 java Phaser 的第 0 阶段工作,那么一个线程arrive(); arrive(); arriveAndAwaitAdvance();会不会等待 Phaser 结束第 2 阶段或第 0 阶段?

0 投票
0 回答
73 浏览

java - 可复位倒计时锁存器

我有一个想解决的问题。我有一个线程必须等待多个可变数量的异步线程完成它们的执行完成,然后,它必须执行并再次保持等待状态,直到其他线程完成它们的执行。

例子:

线程 A 一直等到线程 B 和 C 完成它们的执行。之后必须执行线程 A 并且其他线程应该等待。这是一个重复n次的循环。

线程 C 具有与线程 B 相同的伪代码。

我需要同步这样的东西:线程 A 必须仅在线程 B 和线程 C 执行它们的执行之后执行,并且线程 B 和线程 C 必须等待线程 A 完成其执行。

我尝试使用上面代码中提到的 Phaser 和 Phaser,但我没有得到预期的结果。

有人可以举个例子吗?

我正在使用 Java 8,并且正在寻找可重置形式的 CountDownLatch,可能使用移相器。