マルチスレッド

★マルチスレッド分類

スレッド基本

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();

...

}

}