- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个程序:“使用线程翻转硬币”。每个线程都在翻转硬币,如果翻转头部线程停止,如果翻转尾部,线程应该翻转直到你得到头部,然后停止该线程,最后每个线程计算我在行中翻转了多少尾部并将其作为数字。
这就是我所做的:
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadLocalRandom;
/**
*
* @author jakub ozorowski
*/
final class RzutMoneta {
public static Float p;
public static void main(String... argv) {
System.out.print("Ilość wątków: ");
int ilość;
Scanner in = new Scanner(System.in);
ilość = in.nextInt();
System.out.print("Prawdopodobieństwo reszki: ");
p = in.nextFloat();
ExecutorService watki = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
for (int i = 0; i < ilość; ++i)
watki.submit(RzutMoneta::run); // wyskakuje w eclipse java problem????? w netbeansie działa bez problemu
watki.shutdown();
}
private static void run() {
Moneta moneta = new Moneta();
int count = 0;
while (moneta.rzut() == Moneta.Strony.Reszka) {
System.out.println(Thread.currentThread().getName() + ": reszka!");
++count;
}
System.out.printf("%s: orzel! %d reszka%n", Thread.currentThread().getName(), count);
}
}
final class Moneta {
public static double p;
Moneta() {
Moneta.p = RzutMoneta.p;
}
enum Strony {
Orzeł, Reszka
}
Strony rzut() {
//return ThreadLocalRandom.current().nextBoolean() ? Strony.Orzeł : Strony.Reszka;
return ThreadLocalRandom.current().nextFloat() > p ? Strony.Orzeł : Strony.Reszka;
}
}
my output:
Number of threads: 3
tails chance: 0,5
pool-1-thread-2: heads! 0 tails
pool-1-thread-3: tails!
pool-1-thread-1: heads! 0 tails
pool-1-thread-3: tails!
pool-1-thread-3: tails!
pool-1-thread-3: heads! 3 tails
//编辑工作程序。
最佳答案
如果我正确理解了这个问题,您将面临的一个障碍是您的所有线程都使用单个对象来跟踪硬币翻转(Rzut_Moneta
实例test
),但您希望每个线程打印翻转的尾部数量。如何将一个线程的结果与其他线程的结果分开?似乎每个线程都应该维护自己的计数器。
为了不断翻转尾部,你需要一个循环。像这样的事情:
while (flip() == Reszka) {
++count;
System.out.println("Tails! Flip again.");
}
System.out.println("Heads!");
看来您在变量作用域方面也遇到了麻烦。您已将所有变量声明为对象中的字段,但其中大多数应该是方法内部的局部变量。我认为不需要任何字段。
如果您需要在线程之间共享数据,您的 Rzut_Moneta
类就不安全;它没有内存屏障,因此不能保证每个线程的更改都是可见的。例如,如果您想计算所有线程看到的尾部总数,则需要将该计数器声明为 volatile
,或者只能在 同步
block 中访问,或者是特殊类型,例如 AtomicInteger
.
如果每个线程都有自己的私有(private)计数器,则无需担心这些并发问题。
我建议这样的结构(只是一个草图,您必须填写原始代码中的详细信息):
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadLocalRandom;
final class RzutMoneta {
public static void main(String... argv) {
int ilość;
double headProbability;
try (Scanner input = new Scanner(System.in)) {
System.out.print("Number of threads: ");
ilość = input.nextInt();
System.out.print("Chance of heads: ");
headProbability = input.nextDouble();
}
ExecutorService threads = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
for (int i = 0; i < ilość; ++i)
threads.submit(() -> run(headProbability));
threads.shutdown();
}
private static void run(double headProbability) {
Moneta moneta = new Moneta(headProbability);
int count = 0;
while (moneta.rzut() == Moneta.Stroną.Reszka) {
System.out.println(Thread.currentThread().getName() + ": tails!");
++count;
}
System.out.printf("%s: heads! %d tails%n", Thread.currentThread().getName(), count);
}
}
final class Moneta {
enum Stroną {
Orzeł, Reszka
}
private final double headProbability;
Moneta() {
this(0.5);
}
Moneta(double headProbability) {
if ((headProbability < 0) || (headProbability > 1))
throw new IllegalArgumentException("Probability between 0.0 and 1.0");
this.headProbability = headProbability;
}
Stroną rzut() {
double toss = ThreadLocalRandom.current().nextDouble();
return (toss < headProbability) ? Stroną.Orzeł : Stroną.Reszka;
}
}
关于java - 使用多线程进行硬币翻转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27006192/
我目前正在做一个项目,试图开发一种用于 P2P 能源交易的货币和模型,其中每产生一千瓦时的可再生能源就会向该生产商类型转换一枚硬币。我的问题是关于销毁智能合约中的代币。 所有与我的项目类似的当前实现都
在没有Maps帮助的情况下通过Memoization解决问题,由于读取文件的方法,我得到了TLE,根据我的说法,这不应该是这种情况。可能的原因是什么? 这是给出 AC - http://ideone.
考虑下面这段伪代码,其中d是面额值数组,k是面额数,n是要进行更改的金额。 Change(d; k; n) 1 C[0] 我真的不明白这部分,你为什么要用它,谁能给我解释一下! 最佳答案 为了回答
我正在尝试在我的网站上实现 Coin Slider (http://workshop.rs/2010/04/coin-slider-image-slider-with-unique-effects/)
我有使用硬币 slider 的画廊 var $jq = jQuery.noConflict(); $jq(window).load(function() { var imhei
我使用了从该站点提取的硬币 slider http://workshop.rs/projects/coin-slider/ .它现在自动滚动并仅在悬停时显示上一个和下一个。我需要禁用自动滚动并正常显示
我的问题是一道CodeFu练习题(2012 round 2 problem 3)。它基本上归结为将整数数组分成两个(几乎)相等的两半并返回两者之间可能的最小差异。我在下面包含了问题描述。如评论中所述,
我们的老师要求我们制作一 jar 硬币,用来计算我们有多少便士、一毛钱等,然后给出总金额。 这是他希望我们使用的模板 https://online.pcc.edu/content/enforced/7
我正在尝试使用币安币 future 的 api 下载 BTC/USD 永续 future 的历史价格数据,具体来说,我想使用 this endpoint .但是,我找不到必须为 BTC/USD 指定的
我上周刚开始学习计算机科学,我们得到了一个名为“硬币”的工作表,其中我必须找出一组硬币中有多少个 25 美分、10 美分、5 美分和 10 便士。我遇到了很多麻烦,并收到了该错误。这是我的代码 pac
我正在构建一些使用消耗性硬币的测验。我使用 NSUserDefault 来保存设备上的硬币及其工作。我还在 qiuz 中使用 CloudKit 处理数据。 不麻烦的是,如果用户切换设备如何恢复硬币?有
我是一名优秀的程序员,十分优秀!