-2

javaからシェルスクリプトを起動したい。Runtime.exec メソッドで実行できます。しかし問題は、シェル スクリプトの実行に約 3 ~ 4 時間かかることです。現在のスレッドを 4 時間待機状態に保つため、このような長いプロセスに Process.waitFor() を適用することはお勧めできません。これは、複数の Java スレッドが複数のシェル スクリプトを呼び出し、それぞれに 3 時間以上かかるマルチスレッド環境で発生します。(スレッド数は少なくなりますが)

Javaプロセスが待機する必要がなく、シェルスクリプトがいつ終了するかを知るために、どうすれば非同期にすることができますか。JMS を使用するオプションがありません。

堅実な解決策をお勧めします。

4

3 に答える 3

2

Callableとを使用しFutureてスクリプトを非同期に起動すると、別のスレッドで待機できます

于 2013-01-14T05:18:30.390 に答える
0

それは次のようなものかもしれません

class AsyncProcessRunner {

    class AsyncProcess implements Runnable {
        String cmd;
        int rc;
        String out;
        String err;

        AsyncProcess(String cmd) {
            this.cmd = cmd;
        }

        @Override
        public void run() {
            // run process here
            processEnded(this);
        }
    }

    void processEnded(AsyncProcess p) {
        // process termination
    }

    public void runAsync(String cmd) {
        new Thread(new AsyncProcess(cmd)).start();
    }
于 2013-01-14T05:23:05.107 に答える
0

しかし問題は、シェル スクリプトの実行に約 3 ~ 4 時間かかることです。現在のスレッドを 4 時間待機状態に保つため、このような長いプロセスに Process.waitFor() を適用することはお勧めできません。これは、複数の Java スレッドが複数のシェル スクリプトを呼び出し、それぞれに 3 時間以上かかるマルチスレッド環境で発生します。(スレッド数は少なくなりますが)

正直なところ、あなたが解決しようとしている問題はほとんど想像上のものだと思います。

何もせずに 4 時間待機する 1 つのスレッドのコストは、何にも代えがたいものです。これは、(通常) 1Mb の非ヒープ領域を使用してスタックを表すコストです。これらのスレッドの数が少なくなると、合計スペースは数メガバイトになります。メモリに制約のあるシステムで実行していない限り、心配する価値さえありません。(それを「お勧めできない」と呼ぶのはストレッチです... IMO)。

また、メモリ制限されている場合は、最初に試行することは、縮小されたスタック サイズでスレッドを割り当てることです。たとえば、このコンストラクタを使用します。このタスクには 10Kb のスレッド スタックで十分だと思います。

于 2013-01-14T05:37:04.183 に答える