1

私はJavaでマルチスレッドプロジェクトを構築しています。データベーステーブルをラップして操作するためのエンティティとDAOパッケージがあります。Runnablesを含む処理パッケージがあります。これまでにRunnablesを実装した方法は、次のようになります。

Class Thread1 implements Runnable{
  Thread t;
   parameters
  ...

  public Thread1(){
    t = new Thread(this,"Thread1");
    ....
    t.start();
  }

  public int method1(){
  ...
  return x;
  }

  public double method2(){
  ...
  return y;
  }

  public void run(){
    // some processing using DAO methods
    ....
    method1();
    ... 
    method2();
    ...
  }

}

コードはこのように機能しますが、クラスrun()での処理の一部として、メソッドで同じ処理を使用する必要があります。Thread2コードを構造化した方法では、コードを再利用できません。これを解決するためのより良い構造は何でしょうか?

4

4 に答える 4

1

次のいずれかを実行できます。

  1. 同じ抽象基本クラスを作成Thread1して拡張し、共有ロジックを親(継承)に移動します。Thread2
  2. 両方のクラスが実装し、共通のメソッドを含む共通のインターフェースを作成してから、を実装する別のクラスを作成し、そこRunnableに実装しrun()ます(構成)。

継承よりもコンポジションを常に優先する必要があります。2番目のオプションは、実行時に動作を変更する柔軟性も提供するため、通常は2番目のオプションの方が適しています。

例:最初に共有インターフェースを作成します

public interface SharedTask {
    public void method1();
    public void method2();
}

両方のクラスにそれを実装させます: public class Thread1 implements SharedTaskpublic class Thread2 implements SharedTask

public class Worker implements Runnable {

    public Worker (SharedTask task) {
        this.task = task;
        ...
    }

    public void run() {
        task.method1();
        task.method2();
    }
}

コードの他の場所: new Worker().start();

于 2012-07-02T22:17:54.290 に答える
1

スレッドを自分で作成して起動することはほとんどありません。Runnable(または必要に応じてCallable)を実装するだけです。次に、それらをExecutorServiceに送信します。これは、実行中のスレッドの数に関するあらゆる種類のクールなオプション(および、ニーズが変更された場合に将来これを変更するための優れた中央の場所)、CompletionServiceへのタイアップなどを提供します...

于 2012-07-02T23:03:05.617 に答える
0

runメソッドに必要なコードを実装する抽象クラスを作成します。Runnable次に、runメソッドに同じ機能が必要な回数だけそのクラスを拡張します。

于 2012-07-02T22:15:22.523 に答える
0

マルチスレッドの詳細に入る前に、すべてのDAO呼び出しが1つのデータベース接続で実行される可能性があります。つまり、(ほぼ)1つのdbスレッドで実行されます。(特にORMフレームワークを使用する場合、ただし単純なデータソースプールでも同じ効果が得られます)この問題は確実に取り除くことができますが、ACID準拠を維持するには、2フェーズコミットでXAリソースを使用する必要があります。これ大きな作業です。そのため、準備ができていない限り、アプリサーバー側のマルチスレッドのニュアンスについて考えるのは無意味です。

于 2012-07-02T22:19:26.173 に答える