私はカウンタを増分し、カウンタを二乗し、操作を繰り返す前に500ミリ秒待つ必要がある練習をしています。 私は2つのスレッドクラスとsynchronized修飾子を使用することを余儀なくされています。 可能でしょうか?誰か助けてくれますか? これは私のコードです:同期を使用して複数のスレッドを持つオブジェクトへの順次アクセス
import static java.lang.Thread.sleep;
public class Sync2Thread{
private static Counter c;
static class Counter{
private int count;
public synchronized int getCount() {
return count;
}
public synchronized void incrCount() {
count++;
System.out.println("+1 => counter= "+count);
try {
sleep(500);
} catch (InterruptedException ex) {
}
}
}
public static void main (String[] args){
c = new Counter();
Thread t = new Thread(new IncrCounter());
t.start();
Thread t2 = new Thread(new Square());
t2.start();
}
/**
* Thread that increment the counter
*/
static class IncrCounter extends Thread {
public void run(){
for(int i = 0; i < 7; i++)
{
System.out.println("Current Counter = "+c.getCount());
c.incrCount();
}
}
}
/**
* Thread that calculates the square
*/
static class Square extends Thread {
public void run(){
for(int i = 0; i < 7; i++)
{
int x = c.getCount();
System.out.println(x + " squared =>"+ x*x + "\n");
yield();
}
}
}
}
私の結果はと似ています
Current Counter= 0
+1 => counter= 1
Current Counter= 1
+1 => counter= 2
1 squared =>1
2 squared =>4
2 squared =>4
2 squared =>4
2 squared =>4
.....
それがなければなりません:
Current Counter= 0
+1 => counter= 1
1 squared =>1
Current Counter= 1
+1 => counter= 2
2 squared =>4
Current Counter= 2
+1 => 3
3 squared =>9
は私がメインだと思うそんなに
こんにちは!あなたはインクリメントの前にロックを使い、平方の後にそれを解放することができます。 –
'Thread.yield()'メソッドは、あなたが思うように思っていません。あなたのコードが単一のCPUマシン上の協調マルチタスク環境で実行されていたのですが、現代のデスクトップまたはラップトップシステム上で実行されている最新のOSでは、 'yield()は何もしないことを想像することです。 –
チップ(解決策ではない):錠を持っている間は眠らないでください。 – bowmore