10

私は並行性を必要とする Java デーモンに取り組んでいます: ジョブ キュー ( redis )をリッスンし、各ジョブを worker に配布する無限ループ。ワーカーは必ずしも値を返す必要はありません。

Executorsは非常に便利で、ThreadPoolExecutorを使用して多数のワーカー スレッドを維持しています。

ただし、これらのワーカーは、静的プロパティの共有を避けて、可能な限り分離して実行する必要があるサードパーティ コードを実行します。

私の質問: Executor に似た機能を提供する Java ライブラリ/フレームワークはありますか?

  • ワーカープール
  • 自動的に調整されたプール サイズ

..しかし、スレッドの代わりにプロセスを生成しますか?

4

3 に答える 3

8

何らかの形で分離して実行したいサードパーティのライブラリがあることを理解しています。たとえば、それらは静的変数にアクセスできません。

私はあなたのタスクを別ので実行しますClassLoader。このメカニズムを使用して Web 要求を分離する Web フレームワークがあります。クラスローダ間でのデータの受け渡しは少しトリッキーです。Jettyがどのようにそれを行うのかわかりません。たぶん、ある種のソケットを使用していますか?を使用してオブジェクトを共有することに関する興味深い記事をSystem.out次に示します。確かにハック。


私の質問は次のとおりです。エグゼキューターに似た機能を提供するJavaライブラリ/フレームワークはありますか...ただし、スレッドの代わりにプロセスを生成しますか?

最新のオペレーティング システムは、最新のマルチプロセッサ アーキテクチャを利用して、Java スレッドを最大限に活用します。現在のプロセス内で別のスレッドを生成すると、利用可能な場合は別のプロセッサで実行され、そのタスクを完全に別のプロセス、特に別の JVM プロセスと同じくらい重いプロセスで実行するよりもはるかに効率的になります。

于 2012-04-24T19:05:04.677 に答える
2

プロセス プールを作成するプロジェクトが github にあります。見てください。https://github.com/shri30/ProcessPool

次に例を示します。

サンプルコード:

public class UsageExample implements JTask{


    public static void main(String args[]) throws Exception{
        //Create a pool with name : UsageExample-Process and number of processes : 3
        ExecutorService pool = ProcessPool.createProcessPool("UsageExample-Process", 3);
        ProcessFuture<TaskStatus> pf1 = pool.submit(Task.class, args);
        ProcessFuture<TaskStatus> pf2 =pool.submit(Task.class, args);
        ProcessFuture<TaskStatus> pf3 =pool.submit(Task.class, args);
        ProcessFuture<TaskStatus> pf4 =pool.submit(Task.class, args);
        ProcessFuture<TaskStatus> pf5 =pool.submit(Task.class, args);
        //the get method blocks the call to get the result
        TaskStatus ts= pf1.get();
        Status status = ts.getStatus();
        if(status == Status.SUCESS){
        //code goes here
        }

        TaskStatus ts2= pf2.get();
        Status status2 = ts.getStatus();
        if(status == Status.SUCESS){
        //code goes here
        }


        TaskStatus ts3= pf3.get();
        Status status3 = ts.getStatus();
        if(status == Status.SUCESS){
        //code goes here
        }


        TaskStatus ts4= pf4.get();
        Status status4 = ts.getStatus();
        if(status == Status.SUCESS){
        //code goes here
        }
        //terminate the pool - pass true for graceful termination, the second parameter is minutes
        //wait for task completion
        pool.terminate(true, 3000);
    }


}

class Task implements JTask{

    public static void main(String[] args) {
        System.out.println("Executing the sample task");
    }

}
于 2015-06-12T13:26:28.563 に答える
1

ProcessBuilder を使用して分離されたプロセスを管理するようなことを考えたことはありますか?

String myJar = MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath());
ProcessBuilder pb = new ProcessBuilder("java", "-classpath", myJar, "package.MainClass");
Process p = pb.start();

サブプロセスを管理する Runnable タスクを Executor に送信するのが良い考えかどうかはわかりませんが、ワーカーを分離するための解決策になるかもしれません。

于 2012-04-25T07:15:07.493 に答える