Javaの同時実行は初めてで、現在これを読んでいます。誰かが私に例(コード)を教えてくれるので、それをよりよく理解できますか? どうも
3 に答える
割り込みは、スレッドを(咳をして)割り込みたいときに使用されます。通常は、スレッドの動作を停止することを意味します。 Thread.stop()
さまざまな問題のために非推奨になりThread.interrupt()
ました。スレッドの実行を停止するようにスレッドに指示する方法も同様です。スレッドが実行していることをクリーンアップして終了する必要があります。実際には、プログラマーはスレッドで割り込みシグナルを任意の方法で使用できます。
いくつかの例:
- スレッドが1分間スリープしてから、Webページをスパイダリングしている可能性があります。この動作を停止する必要があります。
- たぶん、あなたはジョブのキューから消費しているスレッドを持っていて、それ以上のジョブが来ていないことを伝えたいと思うでしょう。
- プロセスがシャットダウンしているために中断したいバックグラウンドスレッドがいくつかあり、それをクリーンに実行したい場合があります。
上記のシグナリングを実現する方法は確かにたくさんありますが、割り込みを使用することもできます。
Thread.interrupt()
実行中のスレッドに影響を与えるより強力な方法の1つは、、、InterruptedException
などを含むいくつかの異なるメソッドからスローすることです。Thread.sleep()
Object.wait()
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// i've been interrupted
// catching InterruptedException clears the interrupt status on the thread
// so a good pattern is to re-interrupt the thread
Thread.currentThread().interrupt();
// but maybe we want to just kill the thread
return;
}
また、多くの場合、スレッド内でループして何らかのタスクを実行しているため、割り込みステータスを確認します。
while (!Thread.currentThread().isInterrupted()) {
// keep doing our task until we are interrupted
}
マルチスレッドでは、いくつかの作業を複数のスレッドに分割するという考え方があります。古典的な例は、バックグラウンド計算を実行するスレッドや、ユーザー インターフェイスを処理するメイン スレッドでそのアクションを実行しないとかなりの時間がかかるサーバー クエリなどのバックグラウンド アクションを実行するスレッドを持つことです。
かなりの時間がかかる可能性のあるこれらのアクションをオフロードすることで、ユーザー インターフェイスが動かなくなったように見えないようにすることができます。この例としては、表示されたダイアログでアクションを開始し、別のウィンドウに移動してから表示されたダイアログに戻り、ダイアログをクリックしてもダイアログ自体が更新されない場合があります。
場合によっては、バックグラウンド アクティビティを停止する必要があります。その場合、Thread.interrupt() メソッドを使用して、スレッド自体を停止するように要求します。
例として、1 秒に 1 回サーバーからステータス情報を取得するクライアントがあるとします。バックグラウンド スレッドは、サーバーへの通信とデータの取得を処理します。ユーザー インターフェイス スレッドはデータを受け取り、表示を更新します。次に、ユーザーはディスプレイの停止ボタンまたはキャンセル ボタンを押します。次に、ユーザー インターフェイス スレッドはバックグラウンド スレッドで割り込みを行い、サーバーからのステータス情報の要求を停止します。
並行プログラミングでは、多くのプログラマーがスレッドを停止する必要があるという結論に達します。彼らは、停止する必要があることをスレッドに示すために、何らかのboolean
フラグを設定することをお勧めします。割り込みフラグは、Java 標準ライブラリによって提供されるブール メカニズムです。
例えば:
class LongIterativeTask implements Runnable {
public void run() {
while (!thread.isInterrupted()) { //while not interrupted
//do an iteration of a long task
}
}
}
class LongSequentialTask implements Runnable {
public void run() {
//do some work
if (!thread.isInterrupted()) { //check flag before starting long process
//do a lot of long work that needs to be done in one pass
}
// do some stuff to setup for next step
if (!thread.isInterrupted()) { //check flag before starting long process
//do the next step of long work that needs to be done in one pass
}
}
}