タグ付けされた質問 「multithreading」

マルチスレッドとは、複数の同時実行ストリーム(一般にスレッドと呼ばれる)を利用して、コンピューターまたはプログラムが作業を同時にまたは非同期に実行する機能です。

7
複数のAsyncTaskを同時に実行する—不可能ですか?
2つのAsyncTaskを同時に実行しようとしています。(プラットフォームはAndroid 1.5、HTC Heroです。)ただし、最初にのみ実行されます。これが私の問題を説明する簡単なスニペットです: public class AndroidJunk extends Activity { class PrinterTask extends AsyncTask<String, Void, Void> { protected Void doInBackground(String ... x) { while (true) { System.out.println(x[0]); try { Thread.sleep(1000); } catch (InterruptedException ie) { ie.printStackTrace(); } } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); new PrinterTask().execute("bar bar …

10
なぜwait()は常に同期ブロックでなければならないのですか?
を呼び出すにはObject.wait()、この呼び出しを同期ブロックに配置する必要がありますIllegalMonitorStateException。そうでない場合はがスローされます。しかし、この制限を設ける理由は何ですか?私はそれwait()がモニターを解放することを知っていますが、なぜ特定のブロックを同期させてモニターを明示的に取得し、次に呼び出しによってモニターを解放する必要があるのwait()ですか? wait()同期されたブロックの外部で呼び出すことが可能で、そのセマンティクスを保持する-呼び出し元のスレッドを一時停止する可能性がある場合、どのような損害が考えられますか?

17
スレッドをタイムアウトする方法
一定時間スレッドを実行したい。その時間内に完了しない場合は、強制終了するか、例外をスローするか、何らかの方法で処理します。どうすればできますか? このスレッドから理解した方法の1つ は、スレッドのrun()メソッド内でTimerTaskを使用することです。 これに対するより良い解決策はありますか? 編集:私はより明確な答えが必要だったので、賞金を追加します。以下に示すExecutorServiceコードは私の問題に対応していません。実行後にsleep()を実行する必要があるのはなぜですか(一部のコード-このコードの一部を処理できません)?コードが完了し、sleep()が中断された場合、それはどのようにタイムアウトになりますか? 実行する必要があるタスクは私の制御下にありません。任意のコードを使用できます。問題は、このコードが無限ループに陥る可能性があることです。それが起こらないようにしたい。そのため、別のスレッドでそのタスクを実行したいだけです。親スレッドは、そのスレッドが終了するまで待機する必要があり、タスクのステータス(つまり、タイムアウトしたか、何らかの例外が発生したか、または成功したかどうか)を知る必要があります。タスクが無限ループに入った場合、私の親スレッドは無期限に待機し続けますが、これは理想的な状況ではありません。

10
Visual Studioで単一スレッドをデバッグする方法は?
いくつかのプロジェクトで解決策があります。異なるプロジェクトにはいくつかのブレークポイントがあります。最初のスレッドがこれらのブレークポイントの1つにヒットしたことをトレースし、他のスレッドが同じコードブロックに入っているにもかかわらず、その単一のスレッドのトレースを続けたいと思います。 私は、これは=であるブレークポイント、スレッド名に条件を定義することによって可能である知っている...またはスレッドID = ...しかし、私の場合は重いですロードされたASP.NETのアプリケーションをして、すぐに私は添付としてw3wp.exe多くのスレッドはブレークポイントにヒットします。のようなものが必要ThreadLocal<break-point>です。 出来ますか?もしそうなら、どうですか?

14
Linuxでのスレッドとプロセス
Linuxはプロセスを処理するのに非常に効率的であり、スレッドに関連する多くの問題(ロックなど)があるため、Linuxではほとんどの場合スレッドの代わりにプロセスを使用する方が良いと言う人がいます。ただし、状況によってはスレッドがかなり大きなパフォーマンスの向上をもたらす可能性があるため、私は不審です。 だから私の質問は、スレッドとプロセスの両方がかなりうまく処理できる状況に直面したときに、プロセスとスレッドのどちらを使用するべきかということです。たとえば、Webサーバーを作成している場合、プロセスまたはスレッド(またはその組み合わせ)を使用する必要がありますか?

3
RxJavaスケジューラの使用例
RxJavaには、5つの異なるスケジューラーから選択できます。 immediate():現在のスレッドですぐに作業を実行するスケジューラを作成して返します。 trampoline():現在の作業が完了した後に実行される現在のスレッドで作業をキューに入れるスケジューラを作成して返します。 newThread():作業単位ごとに新しいスレッドを作成するスケジューラを作成して返します。 Calculation():計算作業を目的としたスケジューラを作成して返します。これは、イベントループ、コールバックの処理、およびその他の計算作業に使用できます。このスケジューラでIOバインド作業を実行しないでください。スケジューラを使用します。代わりにio()。 io():IOにバインドされた作業を目的としたスケジューラを作成して返します。実装は、必要に応じて拡張されるエグゼキュータスレッドプールによってサポートされます。これは、ブロッキングIOを非同期で実行するために使用できます。このスケジューラで計算作業を実行しないでください。スケジューラを使用します。代わりに計算()。 質問: 最初の3つのスケジューラは自明です。ただし、計算とioについて少し混乱しています。 「IOバウンド作業」とは正確には何ですか?ストリーム(java.io)およびファイル(java.nio.files)の処理に使用されますか?データベースクエリに使用されますか?ファイルのダウンロードやREST APIへのアクセスに使用されますか? どのように計算は()とは異なる)newThread( ?それはすべての計算です()呼び出しが毎回新しい(バックグラウンド)スレッドではなく単一の(バックグラウンド)スレッド上にあるのですか? IO作業を行うときに計算()を呼び出すのはなぜ悪いのですか? 計算作業を行うときにio()を呼び出すのはなぜ悪いのですか?




11
async-awaitが追加のスレッドを作成しない場合、どのようにしてアプリケーションを応答可能にしますか?
何度も繰り返しますが、async- を使用awaitしても追加のスレッドは作成されません。コンピュータが一度に複数のことを実行しているように見える唯一の方法は、 実際に一度に複数のことを実行している(並列実行、複数のプロセッサの使用) タスクのスケジューリングとそれらの間の切り替えによるシミュレーション(Aを少し、Bを少し、Aを少しなど) それで、もしasync- awaitそれらのどちらもしないなら、それはどのようにしてアプリケーションを応答可能にすることができますか?スレッドが1つしかない場合、メソッドを呼び出すと、メソッドが完了するのを待ってから、他の処理を行うことになります。そのメソッド内のメソッドは、処理を進める前に結果を待つ必要があります。

7
デーモンスレッドの説明
ではPythonドキュメント 、それは言います: スレッドは「デーモンスレッド」としてフラグを立てることができます。このフラグの重要性は、デーモンスレッドだけが残されると、Pythonプログラム全体が終了することです。初期値は作成スレッドから継承されます。 誰かがそれが何を意味するのかを明確に説明したり、スレッドをdaemonicどこに設定するかを示す実際的な例を持っていますか? 明確にしてください。つまり、スレッドをdaemonicに設定しない唯一の状況は、メインスレッドが終了した後もスレッドを実行し続けたい場合です。

15
C#イベントとスレッドセーフ
更新 C#6以降、この質問に対する答えは次のとおりです。 SomeEvent?.Invoke(this, e); 私は頻繁に次のアドバイスを聞いたり読んだりします: 確認して実行する前に、必ずイベントのコピーを作成してくださいnull。これにより、nullnullを確認する場所とイベントを発生させる場所の間にイベントが発生する、スレッドに関する潜在的な問題が解消されます。 // Copy the event delegate before checking/calling EventHandler copy = TheEvent; if (copy != null) copy(this, EventArgs.Empty); // Call any handlers on the copied list 更新:最適化について読んだことから、これにはイベントメンバーも揮発性である必要があるかもしれないと思いましたが、ジョンスキートは彼の回答でCLRはコピーを最適化しないと述べています。 しかし、その間、この問題が発生するためには、別のスレッドが次のようなことをしている必要があります。 // Better delist from event - don't want our handler called from now on: otherObject.TheEvent -= OnTheEvent; …

11
「スレッド」とは(本当に)何ですか?
私は良い定義を見つけ、スレッドが本当に何であるかを理解しようと努めてきました。 私は明らかな何かを見逃しているように思えますが、スレッドとは何かについて読むたびに、それはほぼ循環的な定義であり、「スレッドは実行のスレッド」または「実行中のタスクに分割する方法」です。ええと。えっ? 私が読んだことから、スレッドは実際にはプロセスのような具体的なものではないようです。それは実際には単なる概念です。私は道のこの作品を理解してどのようなことから、プロセッサは(と呼ばれているプログラムのためのいくつかのコマンドを実行実行のスレッドを)、それは少しのためのいくつかの他のプログラムのための処理に切り替えるために必要がある場合、それは保存状態のをそれが現在どこかで実行しているプログラム(スレッドローカルストレージ)、次に他のプログラムの命令の実行を開始します。そして前後に。このように、スレッドは実際には現在実行中のプログラムの「実行パスの1つ」の単なる概念です。 プロセスとは異なり、これは本当に何かです-それはリソースの集まりなどです。 あまり役に立たなかった定義の例として。。。 ウィキペディアから: 「コンピューターサイエンスのスレッドとは、実行のスレッドの略です。スレッドとは、プログラムが自身を2つ以上の同時(または疑似同時)実行中のタスクに分割する(「分割」と呼ばれる)方法です。スレッドとプロセスは1つとは異なります別のオペレーティングシステムへのオペレーティングシステムですが、一般に、スレッドはプロセス内に含まれており、同じプロセス内の異なるスレッドは同じリソースを共有しますが、同じマルチタスクオペレーティングシステム内の異なるプロセスは同じリソースを共有しません。 それで私は正しいのですか?違う?本当にスレッドとは何ですか? 編集:どうやらスレッドにも独自の呼び出しスタックが与えられているため、これはやや具体的なものです。

2
非同期プログラミングとマルチスレッドの違いは何ですか?
私はそれらは基本的に同じものだと思っていました—プロセッサー間でタスクを分割するプログラムを書く(2つ以上のプロセッサーを持つマシン上で)。それから私はこれを読んでいます、それは言う: 非同期メソッドは、非ブロッキング操作を目的としています。非同期メソッドのawait式は、待機中のタスクの実行中に現在のスレッドをブロックしません。代わりに、式は継続としてメソッドの残りの部分にサインアップし、asyncメソッドの呼び出し元に制御を返します。 asyncおよびawaitキーワードを使用しても、追加のスレッドが作成されることはありません。非同期メソッドは独自のスレッドで実行されないため、非同期メソッドはマルチスレッドを必要としません。メソッドは現在の同期コンテキストで実行され、メソッドがアクティブな場合にのみスレッドで時間を使用します。Task.Runを使用してCPUにバインドされた作業をバックグラウンドスレッドに移動できますが、バックグラウンドスレッドは、結果が利用可能になるのを待っているだけのプロセスには役立ちません。 そして、誰かがそれを英語に翻訳できるかどうか疑問に思っています。これは、非同期性(つまり、単語ですか?)とスレッド化を区別しているようで、非同期タスクはあるがマルチスレッド化はできないプログラムを作成できることを示しています。 これで、pgの例のような非同期タスクの考え方がわかりました。ジョンスキートのC#の詳細、第3版の467 async void DisplayWebsiteLength ( object sender, EventArgs e ) { label.Text = "Fetching ..."; using ( HttpClient client = new HttpClient() ) { Task<string> task = client.GetStringAsync("http://csharpindepth.com"); string text = await task; label.Text = text.Length.ToString(); } } asyncキーワードの手段が、「この機能は、それが呼ばれるたびに、そのコールが呼ばれるようにした後、その完了がすべてのために必要とされるコンテキストで呼び出されることはありません。」 つまり、あるタスクの途中でそれを書く int x = 5; DisplayWebsiteLength(); double …


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.