1

ここに私のコード(クラス)があります:

package table2thread;

import java.util.logging.Level;

import java.util.logging.Logger;

public class Table2Thread extends Thread {

    private int j;
    private boolean flag;

    Table2Thread(int j0) {
        j = j0;
    }

    public void run() {

        if (Thread.currentThread().getName().equals("Thread1")) {
            for (int i = 1; i < 11; i++) {
                System.out.println(j + "*" + i + "=" + j * i);
                flag = true;
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                    Logger.getLogger(Table2Thread.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        } else if (Thread.currentThread().getName().equals("Thread1") && flag == true) {
            for (int i = 1; i < 11; i++) {
                System.out.println(j + "*" + i + "=" + j * i);
                flag = false;
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                    Logger.getLogger(Table2Thread.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }
}

これが私のメインクラスです:

public class Main {
    public static void main(String[] args) {

        Table2Thread a1 =new Table2Thread(3);
        a1.setName("Thread1");
        a1.start();
        Table2Thread a2 =new Table2Thread(4);
        a2.setName("Thread2");
        a2.start();
    }
}

一度に 1 つのスレッドだけが必要で、一意のスレッドだけが必要です。最初にa1、次にa2、次に再びa1とa2ですが、今コードを実行すると、最初にa1が開始し、次にa2が開始し、3〜4回インクリメントした後、a1が開始し、再びa1が開始し、次にa2が開始し、再びa2が開始します。いろいろ試してみましたが、初心者なのでうまくいきません。

助けてください

4

3 に答える 3

1

そのような場合、なぜスレッドを使用したいのでしょうか?

スレッドのロジックをメソッド (または単純なクラス) に配置し、メインでループしてそのメソッドを呼び出すだけです。

ここで行っているようなスレッドを本当に使用したい場合は、できることがたくさんあります。

方法 1: 最初に、a1 と a2 を実行し続けたい場合は、それらを何度も実行し続けるための何らかのループが必要です。最初の方法は、メインにループを作成し、a1 または a2 を開始した後、a1.join()/a2.join() を追加して、スレッドを開始し、終了するまで待ってから、次のスレッドを開始することです。 .

方法 2: 代わりにスレッド内にループがあり、両方のスレッドがモニター/セマフォを共有している可能性があります。ループでロジックを実行する前に、次のようにモニターを取得します。

public void run() {
   while (running) {
      synchronized(sharedMonitor) {
          while (flag != thisThread) {
              sharedMonitor.wait();
          }
          //your actual logic here
          flag = nextThread;
          sharedMonitor.notifyAll();
      }
   }
}

方法 3: 自分でスレッドを管理する代わりに、Executor を作成します。Executor に 2 要素のブロック キューを使用することを検討してください。1 スレッドの Thread Pool Executor を使用することもできます。したがって、メイン ループは、a1/a2 のロジックを表す Runnable を作成し続け、executeRunnable のエグゼキュータに送信します。

于 2013-09-18T07:23:12.800 に答える
0

Thread::Join メソッドを使用することをお勧めします。

public class Main {
    public static void main(String[] args) {

        Table2Thread a1 =new Table2Thread(3);
        a1.setName("Thread1");
        a1.start();
        a1.join();
        Table2Thread a2 =new Table2Thread(4);
        a2.setName("Thread2");
        a2.start();
    }
}

ありがとうニラジ・ラティ

于 2013-09-18T06:29:53.413 に答える