打印出來的數字我正在學習如何在Java線程工作,我需要一些建議..Java線程同步 - 在正確的順序
我想在標準輸出數字打印從0..50使用三個線程完成它的線程的名稱。
我有兩個類 - 類反是實現Runnable和類主要創建並運行線程。計數器具有在線程之間共享的變量c。
我的想法是,我加1 ç,然後調用收益率()當前線程上,以便其他線程會做同樣的。重複此操作直到c達到50.
但是它沒有工作,數字按錯誤順序打印出來。我該如何解決?
public class Counter implements Runnable {
Thread t1;
private int c = -1;
public Counter() {
}
public Counter(String name) {
t1 = new Thread(this, name);
t1.start();
}
@Override
public void run() {
while (c < 50) {
increment();
Thread.yield();
}
}
public void increment() {
if (c < 50) {
c++;
System.out.println(Thread.currentThread().getName() + ": " + c);
}
}
}
public class Main {
public static void main(String[] args) throws IllegalThreadStateException {
Counter c1 = new Counter();
Thread t1 = new Thread(c1, "Thread 1");
Thread t2 = new Thread(c1, "Thread 2");
Thread t3 = new Thread(c1, "Thread 3");
t1.start();
t2.start();
t3.start();
}
編輯:最後我解決了這個問題。感謝所有幫助我開展多線程開局的人。
import java.util.concurrent.atomic.AtomicInteger;
public class Counter2 implements Runnable {
// you could also use simple int
private AtomicInteger c = new AtomicInteger(-1);
private static final Object syncObject = new Object();
public Counter2() {
}
@Override
public void run() {
while (c.get() < 50) {
synchronized (syncObject) {
if (c.get() < 50) {
System.out.println(Thread.currentThread().getName() + ": " + c.incrementAndGet());
}
}
}
}
}
你可以發佈一些他們正在打印的例子嗎? – Argote 2011-04-11 10:02:03
你試過AtomicInteger嗎? – 2011-04-11 10:03:59
我認爲這是隨機的.. – 2011-04-11 10:04:30