【问题标题】:New thread per each boolean true combination [closed]每个布尔真组合的新线程[关闭]
【发布时间】:2021-11-18 03:33:44
【问题描述】:

我怀疑实现这一目标的更好方法是什么:

我有一个包含 5 个布尔变量的类(例如:11111,是一种组合)。现在,问题是我将为每个真正的组合启动一个新线程,这意味着如果我有 11000,我想为 11000 启动一个线程,另一个为 10000,最后一个为 01000。

我必须知道输入组合的所有值。最明显和低效的方法是只比较所有 32 个(在这种情况下)组合(00000、00001 等),并且仅在该组合和实际值(11000)为 != 0 时才开始,那就是我之前提到的案例(11000、10000 和 01000)。

在这种情况下,我将不得不每次进行 32 次比较。问题是,如果那时我有 6 个布尔值,现在我必须做 64 个,依此类推。

谁能想出更好的策略来“捕获”每一种组合?

【问题讨论】:

  • 由于启动线程是一项相当昂贵的操作,因此决定何时启动新线程的代码有多复杂并不重要......但目前还不清楚你到底有什么问题 -看来您只需要启动与值 1-31 相对应的 31 个线程(跳过 00000)...也许edit 显示您拥有的代码的问题并简要说明您已经测量了哪些部分并发现它需要优化。跨度>
  • 嗨,阿列克谢!我还没有编码,只是看看什么是最好的(或至少是好的)方法。对不起,我不需要启动 31 个线程,我只需要为每个真实位组合启动一个线程。问题是我必须测试所有 31 种具有真实位的组合,即 5 位。也许如果有更多的比特,事情就会开始变得更大。我的问题是这是否是唯一的方法。

标签: java concurrency binary boolean combinations


【解决方案1】:

我认为加快速度的唯一方法是通过预先计算。

所以,应该使用String[][] arr;for (String a : arr[5]) {/* thread creation etc */}

其中“5”是“00101”。

也可能有帮助:Integer.toBinaryString(5)(int) Long.parseLong("00101", 2)

【讨论】:

  • 嗨帖木儿!对不起,我只看到 3 种组合(10010、10000 和 00010)。每个输入的“真实”组合我只需要一个线程。问题是我把它放在二进制上以便更容易解释,但这些是 5 个不同的布尔值,所以我认为顺序很关键,可以忽略 0 来计算操作,但最后我需要知道所有位状态(10010、10000 和 00010)。谢谢!
  • 哦,对不起,我的错误。正如我现在所看到的,至少“1”应该适合您的情况。所以,你应该像a^b - 1 这样的情况除外。请添加到您的问题信息中,必须为每个线程名称字符串设置“10010”。 - 这并不明显。
  • 事情是,知道我必须做多少比较不是麻烦,在这里。问题是我必须为每个组合启动每个线程,但知道实际组合,我想出的唯一方法是我在原始帖子中解密的那个,(比较所有 31 个值并执行 AND),这将是一种方法并且它会起作用,但问题是是否有任何其他方法(也许不必做 (2^n)-1 比较是 n 个布尔值。
  • 现已完全编辑
猜你喜欢
  • 2014-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 1970-01-01
  • 2017-03-15
  • 2022-10-05
  • 2015-02-01
相关资源
最近更新 更多