0
import java.lang.Thread;

class ThreadExperiment implements Runnable {
  public static void main(String[] args) {
    Thread t = new Thread(new ThreadExperiment());
    @Override
    public void run(){      
        do {
            num ++;
            try {
                Thread.sleep(400);
            } catch (InterruptedException e){
            }
        } while (num >= 0);
    }

    Thread t2 = new Thread(new ThreadExperiment());
    @Override
    public void run() {
        do {
            num2--;
            try {
                Thread.sleep(400);
            } catch (InterruptedException e){
            }
        } while (num >= 1);
    }


    int num = 1;
    int num2 = 10;
    t.start();
    t2.start();
    if (num == num2) {
        t.interrupt();
        t2.interrupt();
    }
  }
}

糸をいじったり、ぐるぐる回ったり、いつも近寄ったり。2 つのスレッドが必要です。1 つは数値カウントを増やし、もう 1 つは数値カウントを減らします。会ったらやめてほしい。しかし、私は public void run() に問題があります - 現時点では、私はt have a semi-colon next to both of them. What isn正しくないと言っていますか? これは public void run() を配置する適切な場所ですか?

また、いくつかの Web サイトでは、スレッドを作成するために 2 つの別個のクラスが必要だと言っています。これには理由がありますか? 1 つのスレッドが別のスレッドの計算に依存しているが、別の経路をたどっている場合、私には理解できますが、私の感じは異なります。2 つの別個のエンティティだけです。

最後に、インポートステートメントが必要ですか?

4

3 に答える 3

1

1)。コードをコンパイルしたい。

コンパイルの問題は、メイン メソッド内で実行メソッドを宣言するためです。メソッド宣言を分離し、 main を使用してスレッドを作成および実行します。

2)。2 つのスレッドを同時に動作させる必要があります。

つまり、2 つの異なるスレッド クラスを定義するか、インクリメントとデクリメントの両方を処理するロジックを備えた 1 つのスレッドを定義する必要があります。Andrew Mao の回答は、2 つの個別のスレッドを定義する方法の出発点となります。上記の私のコードは、パラメーターを使用してどちらに進むかを決定する run メソッドの単一の定義を使用しています。

3)。2 つのスレッドが別々にインクリメント/デクリメントしている間に衝突をチェックする必要があるため、2 つのスレッドが同じデータに対して同時に動作する必要があります。

これを行う簡単な方法は、メイン メソッドで処理するオブジェクト (num1 と num2) を作成し、これらのオブジェクトへの参照をスレッドに渡すことです。上記の私のコードの例。

4)。あなたは物事をテストしたい

java.lang.* はすべて自動的にインポートされることを前提としています。明確にするためにそこに置いても害はありませんが、選択した開発ツールの自動インポーターコマンドは、おそらく冗長として削除します。

public class ThreadExperiment implements Runnable {
    /* these fields are unique to each instance of ThreadExperiment */
    private int increment = 0;

    /* these are used to point to the original num1 and num2 instances created in your main method */ 
    private Integer myNumber;
    private Integer theOtherNumber;


/** 
 * Constructor.   
 */
public ThreadExperiment(int increment, Integer num1Ref, Integer num2Ref) {
    this.increment = increment;
    this.myNumber = num1Ref;
    this.theOtherNumber = num2Ref;
}


@Override
public void run() {
    do {
        myNumber += increment;
        try {
            Thread.sleep(400);
        } catch (InterruptedException e) {
        }
        System.out.println(Thread.currentThread().getName() + " -- " + myNumber);
    } while (!myNumber.equals(theOtherNumber));
}


/** 
 * Your static main method used to instantiate & start threads 
 */
public static void main(String[] args) {
    Integer num1 = 0;
    Integer num2 = 10;

    Thread t = new Thread(new ThreadExperiment(1, num1, num2), "Thread 1");
    Thread t2 = new Thread(new ThreadExperiment(-1, num2, num1), "Thread 2");
    t.start();
    t2.start();
}

}
于 2013-02-23T02:48:46.640 に答える