問題タブ [callable]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 私が書いていなかった動的にロードされたCallablesをキャンセルする
ディレクトリ内の複数のJARからクラスを動的にロードするコードがいくつかあります。JAR内のコードは信頼できないため、メインアプリケーションを「サンドボックス化」することで、コーディングが不十分な動的クラスや悪意のある動的クラスからメインアプリケーションを保護したいと思います。私がやろうとしていることの1つは、信頼できないコードの実行を「タイムボックス化」し、時間がかかりすぎる場合はコードを強制終了することです(たとえば、無限ループでスタックしているため)。CallableとFutureを使用してこれを実装しようとしています。これは、タスクを並行して実行するためではなく(実行しない)、戻り値を提供し、例外をキャプチャし、実行中のタスクをキャンセルするために行われた作業を利用するためです。ただし、いくつかのテストコードで実行すると、Future.cancel(true)を呼び出してもタスクがキャンセルされないようです。
StackOverflowでこれが発生する理由についていくつかの質問(これなど)を見てきましたが、答えは常に同じです。cancel(true)は、Callableを実行しているスレッドでinterrupt()を呼び出すことで機能します。これには、キャンセルが必要です。キャンセルが有効になる前のinterrupt()ible操作(Thread.sleep()など)のタスクブロック。私は実行中のコードを制御していないので、それが実行される保証はありません。したがって、キャンセルしたかどうかはわかりません。
動的にロードされたコードを実行し、後で進行中のコードを強制終了して、interrupt()ible操作でブロックされない場合でも確実に停止する方法はありますか?
java - マルチスレッドのファイル処理とレポート
入力ディレクトリから多数のファイルに格納されたデータを処理し、そのデータに応じて出力を生成するアプリケーションがあります。
これまでのところ、アプリケーションはシーケンシャルに動作します。つまり、「マネージャー」スレッドを起動します。
- 入力ディレクトリの内容を
File[]
配列に読み込みます - 各ファイルを順番に処理し、結果を保存します
- すべてのファイルが処理されると終了します
これをマルチスレッド アプリケーションに変換したいと思います。このアプリケーションでは、「マネージャー」スレッドが
- 入力ディレクトリの内容を
File[]
配列に読み込みます - それぞれが単一のファイルを処理し、結果を保存し、そのファイルの要約レポートを「マネージャー」スレッドに返します。
- すべてのファイルが処理されると終了します
「プロセッサ」スレッドの数は、ThreadPoolExecutor
.
join()
orの使用を回避するソリューションwait()/notify()
が望ましいでしょう。
上記のシナリオに基づいて:
- これらの「プロセッサ」スレッドが「マネージャ」スレッドに報告する最良の方法は何でしょうか? ここに基づく実装は意味がありますか
Callable
?Future
- 「マネージャ」スレッドは、すべての「プロセッサ」スレッドが終了したとき、つまりすべてのファイルが処理されたときをどのように知ることができますか?
- プロセッサ スレッドを「タイミング」し、「時間がかかりすぎる」場合 (つまり、事前に構成された時間が経過しても結果が返されない場合) に終了する方法はありますか?
(疑似)ソースコードへのポインタまたは例を教えていただければ幸いです。
java - 最速の同期技術
以下は、最も高速な技術が必要な、シーケンシャル (シングルスレッド) または同時 (マルチスレッド) のいずれかの方法で共通リソースにアクセスするかなり一般的なシナリオです。
より具体的には (以下のサンプル ソース コードを参照)、クラスは、共通のリソース (オブジェクト)を持つ(または) クラス ( )Manager
のいくつかのインスタンスを作成します。クラスは実際にはサブクラス化され、サブクラスの実装に応じて、同じスレッドまたは複数のスレッド (たとえば、 を介して) でハンドラを順次実行するために、そのメソッドがオーバーライドされます。Runnable
Callable
Handler
Store
Manager
execute()
ExecutorService
私の質問は、特にシングルスレッドアクセスの場合、同期が冗長であることを考慮して、各オブジェクトの(または) メソッドStore
内で共有オブジェクトへのアクセスを同期する最速の (オーバーヘッドの少ない) 方法は何でしょうか?マルチスレッドのサブクラスの実装もあるからです)。run
call()
Handler
Manager
たとえば、を呼び出す前後にからのオブジェクトsynchronized (this.store) {this.store.process()}
を使用するよりも、ブロックの方が優れているでしょうか? または、ストア アクセスごとに個別のメソッドを内部で使用すると、より高速になりますか? たとえば、 を呼び出す代わりに、次のように実行します。Lock
java.util.concurrent
this.store.process()
synchronized
Handler
this.store.process()
以下は、(サンプル) ソース コードです。
java - なぜ newFixedThreadPool を増やすとパフォーマンスが低下するのですか?
レポートの実行を変更して、並行して実行しようとしています。「シリアル モード」では実行テストに 30 秒かかり、同時実行モードを使用すると 27 秒かかります (シリアルでいくつかの手順を実行する必要があることを考慮してください。結果は問題ありません)。
私がまだ得ていないのは、この行です:
私のコンピューターは 2x2.6 Ghz クアッド コアで武装しており、newFixedThreadPool が高い (16) 場合、実行時間が減少すると予想されます。実際には、newFixedThreadPool を増やすほど、実行が遅くなります。これは疑問を投げかけます:私は何を間違っているのか、何を理解できていないのでしょうか?!?!
実行結果のスクリーンショットを 2 つ埋め込んでいます。
A. newSingleThreadExecuter - 23 秒で実行
B. newFixedThreadPool(4) - 43 秒で実行されます。
「Worker」を送信するたびに、system.out で currentTimeMillis を取得し、「fatched tkt」の結果は、データベースからデータを取得するのにかかるミリ秒です。(戦略 A では最大 3 ミリ秒、戦略 B では最大 7 ミリ秒かかります)。
java - java.util.concurrent マルチスレッド
私は最近、java.util.concurrent をいじり始めました。誰かが私のコードの欠陥や悪い習慣を指摘してくれたら幸いです。
プログラムはタイムアウトになるまで実行され、完了したすべてのタスクを出力します。
- この場合、ArrayList を使用する必要がありますか?
- おそらくよりスレッドセーフな、このタスクに適したクラスはありますか。
- 建設的な批判は役に立ちます。
メインクラス
呼び出し可能
java - Callable タイプのスレッドに優先順位を割り当てる
呼び出し可能なスレッドに優先順位を割り当てる必要があるスレッドタスクに取り組んでいます。
これが私のコードです。
後で結果を取得するために、呼び出し可能なスレッドで同期が実行されます。実行可能なスレッドで実行される非同期。
非同期の呼び出し可能スレッドも作成できますが、重要ではありません。そのため、ExecuterService
スレッドに優先順位を付けて割り当てられるようにする方法が私の唯一の問題です。
java - callable を使用して 2 つのパラメーターを渡し、パラメーターの配列を返す
2 つの文字列をスレッドに渡す必要があり、スレッドは両方を含む配列を返します。callable を使用する必要があります。
これが私がこれまでに持っているものです:
以下がメインです。
問題は次のmain
とおりです。結果は String[] を期待しているが、オブジェクトを取得していると書かれています。結果をキャストすると、スローされるように例外を宣言する必要があると表示されます。
java - callable.call 内で閉じられない BufferedReader はどうなりますか?
3 つの質問があります。
BufferedReader
説明するために、私は誰かのコードを見直していて、時々 s が閉じられていないことに気付きました。通常、Eclipse は、これがメモリ リークの可能性があるという警告を表示します (そして、私はそれを修正します)。ただし、 Callable 内部クラス内では、警告はありません。
コードを書いたのは経験豊富な Java 開発者なので、最初は意図的なものだと思いましたが、急いで書いて見落としていたのかもしれません。
私の質問は次のとおりです。
Eclipse がこれを強調しないのはなぜですか (次の質問への回答によって回答される場合があります)
call() メソッド内で閉じられた場合に起こりうる最悪の事態は何ですか? (正当な理由は思いつきません...そしてしばらく探していました...しかし、BufferedReaderを閉じないのは意図的だったのかもしれません)
内部クラス内で BufferedReader が閉じられていない場合に起こりうる最悪の事態は何ですか?