1

これは私が今持っているコードですが、残念ながら継承されたクラスは別のスレッドで実行されません。継承されたクラスを別のスレッドで実行したいのです。これを行う最善の方法を教えてください。

よろしく!

主要

public class Main
{
  public static void main(String[] args)
  {
    new Thread(new ClassA(country, category, false, false)).start();
  }
}

クラスA

ClassA extends Common implements Runnable
{
  volatile String   country;
  volatile String   category;
  volatile Boolean  doNotReset;
  volatile Boolean  doNotFlash;

  public ClassA(String country, String category, Boolean doNotReset, Boolean doNotFlash)          
  {
    this.country = country;
    this.category = category;
    this.doNotReset = doNotReset;
    this.doNotFlash = doNotFlash;
  }

  @Override
  public void run()
  {

  }
}

一般

public class Common
{
  Common()
  {
    Thread t = Thread.currentThread();
    String name = t.getName();
    System.out.println("name=" + name);
  }
}
4

2 に答える 2

6

継承されたクラスは実際に別のスレッドで実行されていますが、currentThread のデバッグは Runnable ClassA インスタンスではなく、メイン メソッドのスレッド内で行われます。ClassA インスタンスは、スレッド自体が実際に開始される前に構築されます (したがって、Common コンストラクターが呼び出されます)。そのため、コンストラクターで呼び出された Thread.currentThread() は依然としてメイン スレッドです。

期待される結果を出力するようにデバッグを修正するには、Common または ClassA のオーバーライドされた run() メソッドに Common のコンストラクターの本体を移動できます (ポリモーフィズムによって決定されるように、呼び出された run() メソッドのままである限り)。

于 2012-07-13T06:51:27.663 に答える
0

メソッドの本体のみがrun()別のスレッドで実行されます。そして、あなたが呼び出すときだけThread.start()。残りのコンストラクターおよびその他のメソッドは、現在のスレッドで実行されます。

以下を実装する匿名クラスを使用して、新しいスレッドでコンストラクターを呼び出すことができますRunnable

new Thread(new Runnable(){
    new ClassA(country, category, false, false);
}).start();
于 2012-07-13T06:54:08.570 に答える