私はこの単純なスレッド減算プログラムを作成しました。 正常に動作しますが、出力の最後には3つのランダムな値が与えられます。私はそれを防ぐ方法は考えていません。 また、各スレッドが自分のカウンタを何回減らしたのかを数えなければなりません。誰かが私にこれを手伝ってもらえますか?単純なMultiThreadsプログラムの出力が間違っています
public class ThreadsExample implements Runnable {
static int counter = 100000;
static long time;
static long endtime;
static float finaltime;
static int value;
static void incrementCounter() {
System.out.println(Thread.currentThread().getName() + ": " + counter);
counter--;
}
@Override
public void run() {
time = System.nanoTime();
while (counter >= 0) {
incrementCounter();
}
endtime = System.nanoTime() - time;
finaltime = endtime;
System.out.println(finaltime/1000000000 + " sekundy");
}
public static void main(String[] args) throws InterruptedException {
ThreadsExample threads = new ThreadsExample();
Thread thread1 = new Thread(threads);
Thread thread2 = new Thread(threads);
Thread thread3 = new Thread(threads);
Thread thread4 = new Thread(threads);
thread1.start();
thread2.start();
thread3.start();
thread4.start();
if (counter <= 0) {
System.out.println("Thread 1,2,3,4^^^");
}
}
}
一方、同じスレッドインスタンスを各スレッドに渡しています。これにより、内部状態の異常が発生する可能性があります。それぞれのスレッドコンストラクタに対して新しいThreadsExampleを作成してみてください。また、 "Counter"は静的であり、すべてのインスタンスが本質的に正確な時刻に 'counter <0'を検出するので、各ThreadsExampleが本質的に同時に停止するように見えます。これは期待されていますか?または、各スレッドが独自の独立カウンタを管理するようにしたいですか? – pacifier21
あなたは同期の形式がありません。したがって、各スレッドは、いくつかの値「> 0」を読み取り、「カウンタ」を減少させることができるので、「カウンタ」は、いくつかの値「<0」で終了する。さらに、各スレッドは 'finaltime'を値にします。そこに競合状態があります。 – Turing85