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

コンピュータサイエンスでは、同時実行性は複数の計算を重複する期間で実行できるシステムの特性です。計算は、同じチップの複数のコアで実行されたり、同じプロセッサでプリエンプティブに時分割されたスレッドで実行されたり、物理的に分離されたプロセッサで実行されたりします。


13
サイズ制限付きのキャッシュスレッドプールを作成することはできませんか?
作成できるスレッドの数に制限を設けて、キャッシュされたスレッドプールを作成することは不可能のようです。 静的なExecutors.newCachedThreadPoolが標準Javaライブラリにどのように実装されているかを次に示します。 public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } したがって、そのテンプレートを使用して、固定サイズのキャッシュされたスレッドプールを作成します。 new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new SynchronusQueue<Runable>()); これを使用して3つのタスクを送信すると、すべてが正常になります。さらにタスクを送信すると、拒否された実行例外が発生します。 これを試す: new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runable>()); すべてのスレッドが順次実行されます。つまり、スレッドプールがタスクを処理するために複数のスレッドを作成することはありません。 これはThreadPoolExecutorの実行メソッドのバグですか?または、これは意図的なものですか?または他の方法がありますか? 編集:私はキャッシュされたスレッドプールとまったく同じものを求めます(オンデマンドでスレッドを作成し、タイムアウト後にそれらを強制終了します)が、作成できるスレッドの数に制限があり、追加のタスクをキューに入れ続けることができますスレッドの制限に達しました。sjleeの回答によると、これは不可能です。ThreadPoolExecutorのexecute()メソッドを見ると、実際には不可能です。SwingWorkerと同じようにThreadPoolExecutorをサブクラス化してexecute()をオーバーライドする必要がありますが、SwingWorkerがそのexecute()で行うことは完全なハックです。

12
Javaでメソッドを非同期に呼び出す方法
私は最近Goのgoroutinesを見ていて、Javaに似たものがあればいいと思いました。私がメソッド呼び出しを並列化する一般的な方法を検索した限り、次のようなことをすることです: final String x = "somethingelse"; new Thread(new Runnable() { public void run() { x.matches("something"); } }).start(); それはあまりエレガントではありません。これを行うより良い方法はありますか?プロジェクトでそのようなソリューションが必要だったので、非同期メソッド呼び出しの周りに独自のラッパークラスを実装することにしました。 J-Goでラッパークラスを公開しました。しかし、それが良い解決策かどうかはわかりません。使い方は簡単です: SampleClass obj = ... FutureResult<Integer> res = ... Go go = new Go(obj); go.callLater(res, "intReturningMethod", 10); //10 is a Integer method parameter //... Do something else //... System.out.println("Result: "+res.get()); //Blocks until …


6
GCDの並行キューとシリアルキュー
GCDの並行キューとシリアルキューを完全に理解するのに苦労しています。私にはいくつかの問題があり、誰かがはっきりとその時点で私に答えてくれることを願っています。 私は、シリアルキューが次々とタスクを実行するために作成および使用されることを読んでいます。ただし、次の場合はどうなりますか。 シリアルキューを作成します dispatch_async(作成したばかりのシリアルキューで)3回使用して、3つのブロックA、B、Cをディスパッチします 3つのブロックが実行されますか: キューがシリアルであるため、順序A、B、C または 並行して(並列スレッドで同時に)、ASYNCディスパッチを使用したため dispatch_syncブロックを次々に実行するために並行キューで使用できることを読んでいます。その場合、シリアルキューが存在するのはなぜですか?必要なだけブロックをSYNCHRONOUSLYディスパッチできるコンカレントキューを常に使用できるので、なぜですか? 良い説明ありがとうございます!

5
CancellationTokenプロパティの使用方法は?
前のクラスRulyCancelerのコードと比較して、を使用してコードを実行したいと思いました CancellationTokenSource。 キャンセルトークンで説明されているように、つまり例外をスロー/キャッチせずにそれを使用するにはどうすればよいですか?IsCancellationRequestedプロパティを使用できますか? 私はそれを次のように使用しようとしました: cancelToken.ThrowIfCancellationRequested(); そして try { new Thread(() => Work(cancelSource.Token)).Start(); } catch (OperationCanceledException) { Console.WriteLine("Canceled!"); } しかし、これによりcancelToken.ThrowIfCancellationRequested();メソッドで実行時エラーが発生しましたWork(CancellationToken cancelToken): System.OperationCanceledException was unhandled Message=The operation was canceled. Source=mscorlib StackTrace: at System.Threading.CancellationToken.ThrowIfCancellationRequested() at _7CancellationTokens.Token.Work(CancellationToken cancelToken) in C:\xxx\Token.cs:line 33 at _7CancellationTokens.Token.<>c__DisplayClass1.<Main>b__0() in C:\xxx\Token.cs:line 22 at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, …

6
AtomicInteger lazySetとset
lazySetとsetメソッドの違いは何AtomicIntegerですか?ドキュメントはについて言うことがたくさん持っていませんlazySet。 最終的には、指定された値に設定されます。 保存された値がすぐに目的の値に設定されるのではなく、将来のある時点で設定されるようにスケジュールされるようです。しかし、この方法の実際の使用法は何ですか?何か例は?
116 java  concurrency  atomic 


5
LinkedBlockingQueueとConcurrentLinkedQueue
私の質問は、以前に尋ねたこの質問に関連しています。プロデューサースレッドとコンシューマースレッド間の通信にキューを使用している状況では、一般的に人々は、LinkedBlockingQueueまたはConcurrentLinkedQueue? どちらを使用する場合の利点/欠点は何ですか? APIの観点から見ることができる主な違いは、LinkedBlockingQueueオプションで境界を設定できることです。

7
node.jsでの並行タスクにはどちらが適していますか?繊維?ウェブワーカー?またはスレッド?
私はいつかnode.jsに出会いましたが、とても気に入りました。しかし、すぐに、CPUを集中的に使用するタスクを実行する機能が大幅に不足していることがわかりました。そこで、グーグルを開始し、問題を解決するために次の回答を得ました。ファイバー、ウェブワーカー、スレッド(thread-a-gogo)。どちらを使用するかは混乱であり、そのうちの1つは間違いなく使用する必要があります。結局のところ、IOだけが得意で他には何もないサーバーを用意する目的は何でしょうか。提案が必要です! 更新: 私は遅れている方法を考えていました。それ以上の提案が必要です。さて、私が考えたのはこれです:(thread_a_gogoまたは多分ウェブワーカーを使用して)いくつかのスレッドを作成しましょう。今、それらをさらに必要とする場合、さらに作成することができます。ただし、作成プロセスにはいくつかの制限があります。(システムによって暗示されるわけではありませんが、おそらくオーバーヘッドが原因です)。これで、制限を超えると、新しいノードをフォークして、そのノード上にスレッドを作成し始めることができます。この方法では、制限に達するまで続行できます(結局のところ、プロセスにも大きなオーバーヘッドがあります)。この制限に達すると、タスクのキューイングを開始します。スレッドが解放されるたびに、新しいタスクが割り当てられます。このように、それはスムーズに進むことができます。 それで私はそう思ったのです。このアイデアは良いですか?私はこのすべてのプロセスとスレッドに関するものは少し新しいので、専門知識はありません。ご意見をお聞かせください。 ありがとう。:)

4
揮発性は高価ですか?
揮発性の実装、特にセクション「アトミック命令との相互作用」について、コンパイラライター向けのJSR-133クックブックを読んだ後、更新せずに揮発性変数を読み取るには、LoadLoadまたはLoadStoreバリアが必要だと思います。ページのさらに下を見ると、LoadLoadとLoadStoreは、X86 CPUでは実質的に何もしません。これは、x86で明示的なキャッシュ無効化なしで揮発性読み取り操作を実行でき、通常の変数読み取りと同じくらい高速であることを意味しますか(揮発性の並べ替えの制約を無視)。 私はこれを正しく理解していないと思います。誰かが私を啓蒙したいと思いませんか? 編集:マルチプロセッサ環境に違いがあるのでしょうか。ジョンVが述べているように、シングルCPUシステムでは、CPUはそれ自体のスレッドキャッシュを調べる可能性がありますが、マルチCPUシステムでは、CPUにいくつかの構成オプションが必要です。マルチCPUシステムで、そうですか? PS:これについて詳しく知る途中で、次のすばらしい記事に出くわしました。この質問は他の人にとって興味深いかもしれないので、ここでリンクを共有します。 Javaの理論と実践:Javaメモリモデルの修正、パート1と Javaの理論と実践:Javaメモリー・モデルの修正、パート2



17
飽和している場合にThreadPoolExecutorのsubmit()メソッドをブロックする方法は?
ThreadPoolExecutor最大サイズに達してキューがいっぱいになると、新しいタスクを追加しようとするとsubmit()メソッドがブロックするような方法を作成したいと思います。RejectedExecutionHandlerそのためのカスタムを実装する必要がありますか、それとも標準のJavaライブラリを使用してこれを行う既存の方法はありますか?

4
DispatchQueue.main.asyncとDispatchQueue.main.syncの違い
DispatchQueue.main.asyncUI関連の操作に長年使っています。 Swiftはとの両方DispatchQueue.main.asyncを提供しDispatchQueue.main.sync、どちらもメインキューで実行されます。 誰かがそれらの違いを教えてくれますか?それぞれをいつ使用すればよいですか? DispatchQueue.main.async { self.imageView.image = imageView self.lbltitle.text = "" } DispatchQueue.main.sync { self.imageView.image = imageView self.lbltitle.text = "" }

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