問題タブ [java-threads]
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.
threadpool - 実行時間の長いスレッドにスレッド プールを使用する必要がありますか?
長時間実行されるスレッドにスレッド プールを使用するか、独自のスレッドを開始する必要がありますか? 設計パターンはありますか?
java - ループ内の終了していないプロセスを強制終了する
次のように表現できる、純粋なJavaの「blackBox」を使用して画像を処理しています。
これはループしています:
ほとんどすべてのプロセスは 2 ~ 5 秒で終了しますが、いくつか (おそらく 2%) は何分間も実行され、一部は終了していないように見えます (理由はわかりません)。これらを(たとえば)30 秒後に終了し、病理画像を記録して、次に進みたいと思います。blackBox には I/O がありませんが、埋め込みThread.isInterrupted()
などの方法もありません。
Thread.stop()
30秒後にプロセスを強制終了するために使用できますか? もしそうなら、どうすればいいですか?[廃止されたことは認識していますが、別の方法が見つかりません。] または、変更せずに問題に取り組むより良い方法はありimageProcess()
ますか?
本質的には、これをフィルターとして実行したいと思います:「処理に 30 秒以上かかるすべての画像を拒否する」。
更新: Peter Lawrey に続いて、私は調査中ProcessBuilder
です。
彼は私が受け入れた Java >=1.8 の簡単な解決策を投稿しました。私は現在Java 1.7を使用しているため、以前のバージョンの単純なケースで機能する独自の回答を投稿しました。
android - アセットから 140,000 アイテムの ArrayList をロードする Android アプリを高速化する方法
slooooooow-to-load Android アプリに変えたばかりの Java プログラムがあります。問題: 140,000 語の「辞書」(Asset
ファイルに格納されている) を処理し、「Windows ワイルドカード」パターンに一致する単語を検索します。たとえば、S???CK* は STICKS、SHACK、STACK、、STACKOVERFLOW に一致します。など。Windows 7 ではかなり高速ですが、電話ではそうではありません。
私が行ったことの 1 つは、140,000 ワードすべてを に読み込むことですArrayList
(コンパイルして実行したことにショックを受けました)。その後、パターンがワイルドカードで始まらない限り、Collections.binarySearch(...)
ルックアップは事実上即時になります。
ただし、配列リストへの読み取りには 60 秒かかり、ユーザー入力はブロックされます。そして、実行する必要があるたびに発生onCreate
します。つまり、容認できないほど頻繁に発生します。
それを加速させたい。
これは完全に機能しますSSCCE
が、遅すぎます。
MainActivity.java
OutputFragment.java
Matcher.java
activity_main.xml
fragment_output.xml
だから私が望むのはそれをスピードアップすることです。「Keeping Your Android App Responsive」を読みました。自分の状況に合わせられるかどうかはわかりません。そこから例を取り、できる限り調整しました。
入力するとすぐに機能するとは思っていませんでしたparams[0].hasNext()
が、可変引数リストが必要なようです。
これを実装しようとした方法は次のとおりです。
このアプローチをあきらめてThread
、管理しなければならない を使用する必要があると思います。私はこれに満足していません。
進め方についての提案は大歓迎です。
java - クラスのコンストラクターを呼び出すためにスレッドが使用されるのはなぜですか?
JMS の本を読んでいるときに、1 つの質問に出くわしました。以下はコードです。私の質問はスレッドに関するものなので、不要な JMS コードを削除しました。
上記のコードで、作成者がコンストラクターを新しいスレッドとして呼び出している理由。以下のようにコンストラクターを呼び出してみましたが、同じ結果が得られます
上記の2つの方法に違いはありますか。新しい Thread() を作成すると、別の新しいスレッドが作成されることはわかっています。ただし、JMS のこの単純な例では、コンストラクターを別のスレッドとして呼び出す必要がありますか?
android - 高頻度で実行される 3 つのスレッドは同じ変数を使用します
私は高頻度でBLE通知からデータを受信し、画面にデータを印刷し、他の周辺機器にデータを送信するAndroidアプリケーションを開発しています。
これは私の状況です:
onCharacteristicChanged コールバックは、10hz で「value」と呼ばれるバイト配列を受け取り、いくつかの float および int 変数でデータをアンパックします
handlerThread に関連付けられた Handler は、30hz ごとに Runnable を開始します。このランナブルはvalueからアンパックされた変数を使用し、新しいデータをいくつかの変数に保存し、ブロードキャストメッセージを UX に送信します
- 10hz ごとに別のスレッドがステップ 1 で保存されたデータを使用し、2 がこの変数に対して何らかの数学演算を行い、特性にデータを書き込みます。
上記の手順では、float、double、および int 変数を保存して使用しています。
私は同時実行を処理することを恐れており、ステップ 2 と 3 で同じハンドラ スレッドを使用して同時実行の問題を解決しようと考えています。しかし、他の通知が到着すると、競合状態の問題があると思います:/
他の質問:どのスレッドで oncharacteristicchanged が実行されますか?
私の問題の詳細: oncharacteristicchanged で新しいバイト配列が到着します (10hz の周波数で)、変数のデータをアンパックし、他のスレッド B (30hz で) でこのデータを使用して計算を行います: ux にブロードキャストを送信し、結果を別の場所に保存します。変数; スレッド C はスレッド B の結果を使用し、他の計算を行い、10hz の特性に書き込みます。
oncharacteristicchanged -> スレッド B -> スレッド C
しかし、どのスレッドで実行されるかわからないため、characteristicchanged で停止することはできません..
あなたは
java - Javaでダウンロードするためのマルチスレッドの使用
URLがデータベースに保存されているWebサイトのHTMLコードを同時にダウンロードしようとしています(約300万のエントリ)。
マルチスレッド技術を使用する必要があることは明らかですが、Java でそれを行う方法に問題があります。
マルチスレッドなしでそれを行う方法は次のとおりです。
関数donloadHTML
はJSoup
ライブラリを使用して主な作業を行います。
私の仕事は一種の「生産者消費者問題」のような気がします。このような方法で表現できると思います。N 個のリンクを含むバッファーがあります。一部のプロセスはそこからリンクを取得し、HTML をダウンロードします。プロセスは、空になったときに新しい URL を db からバッファにロードすることを目的としています。
しかし、私はそれを行う方法がまったくわかりません。Threads
とExecutorService
提供について聞いたことがありThreadPools
ますが、それは私にとって本当に混乱しています。
java - スレッドをデーモン スレッドに設定すると、優先順位が下がりますか?
デーモン スレッドと通常のスレッドの違いを理解しています。を呼び出すsetDaemon(true)
と、スレッドは JVM を維持しないようにマークされます。実行中の非デーモン スレッドがなくなると、JVM は自動的にシャットダウンします。JVM を起動すると、メイン スレッドだけが非デーモン スレッドになります。
また、スレッドの優先度はこれとは別に設定できることも理解しています。を呼び出すことによりsetPriority(Thread.MAX_PRIORITY)
、スレッドはそのスレッド グループで許可されている最大のスケジューリング優先度を持つように設定されます。これらの概念をよく理解しているように感じます。
私の質問は、優先度を下げるデーモン スレッドに固有のものはありますか? それとも、「私が JVM をシャットダウンするのを待つ必要はありません」という単なるフラグですか?
API を介してシャットダウンできない共有ライブラリのスレッドを使用しています。このスレッドにデーモン スレッドとしてフラグを立てるように依頼しましたが、所有者は、これによりスケジューラでの優先度が低下することを懸念しています。優先度はデーモンスレッドの指定とは別に管理されているため、直交する必要があるように思えます。ただし、これに関するドキュメントを見つけるのに苦労しています。
java - ExecutorCompletionService は、完了まで最大 n 秒待機します
ExecutorCompletionService を使用していくつかのタスクを送信しています。次に、最大、たとえば 5 秒待ってから、処理を停止します。
すべてのタスクが完了するまで 5 秒以上待ちたくありません。5 秒以内に完了したタスクの結果を収集したいだけです。どうすればそれを達成できますか?
shutdown
とawaitTermination
onを使用しましexecutorService
たが、メイン スレッドは送信されたすべてのタスクが完了するまで待機し、すべてのタスクが完了するまでに 10 秒かかり、各スレッドの名前を出力します。5 秒で処理を停止するにはどうすればよいですか?