マルチスレッド
★マルチスレッド分類
スレッド基本
C# Thread、ThreadPool、Timer
Java Thread、Runnable、ThreadLocal、Timer
タスク
C# Task
Java TimerTask
スレッド同期
C# MethodImplAttribute、SynchronizationAttribute
Monitor、lock、ReaderWriterLock
AutoResetEvent、ManualResetEvent、Mutex、Interlocked
Java volatile、synchronized
ReentrantLock、ReadWriteLock
Condition、Semaphore
非同期処理(必ずマルチスレッドではない)
C# BeginInvoke、EndInvoke
Java NIO、AIO
JavaScript Callback
並列・並行処理
C# Parallel、PLinq
Java Concurrent
計算によるボルトネック
解決方法:スレッド、並列処理
IOによるボルトネック
解決方法:非同期
★採用順番(C#)
1.Parallel(PLINQ), Task
2.ThreadPool(BackgroundWorker, Timer), BeginInvoke/EndInvoke
3.Thread
※Parallelは同期、Taskは非同期
※Thread:実行の優先順位を決めたい場合
★非同期 vs スレッド
・スレッド
Thread thread = new Thread(() =>
{
var request = HttpWebRequest.Create("https://www.google.co.jp/");
var response = request.GetResponse();
var stream = response.GetResponseStream();
using (StreamReader reader = new StreamReader(stream))
{
var content = reader.ReadLine();
...
}
});
thread.IsBackground = true; //Thread処理を待たない
thread.Start();
...
※CPUを占める
・非同期(IO処理の場合、利用すべき)
var request = HttpWebRequest.Create("https://www.google.co.jp/");
request.BeginGetResponse(this.AsyncCallback, request); //非同期処理を待たない
...
private void AsyncCallback(IAsyncResult ar)
{
WebRequest request = ar.AsyncState as WebRequest;
var response = request.EndGetResponse(ar);
var stream = response.GetResponseStream();
using (StreamReader reader = new StreamReader(stream))
{
var content = reader.ReadLine();
...
}
}