多线程是一种有效提高程序工作效率的方法。当然为了效率需要使用更多的cpu,内存等资源。
并发是两个队列交替使用一台咖啡机,并行是两个队列同时使用两台咖啡机,如果串行,一个队列使用一台咖啡机,那么哪怕前面那个人便秘了去厕所呆半天,后面的人也只能死等着他回来才能去接咖啡,这效率无疑是最低的。
并发和并行都可以是很多个线程,就看这些线程能不能同时被(多个)cpu执行,如果可以就说明是并行,而并发是多个线程被(一个)cpu 轮流切换着执行。
运行一个线程
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 new Thread(Go).Start(); // .NET 1.0开始就有的 6 Task.Factory.StartNew(Go); // .NET 4.0 引入了 TPL 7 Task.Run(new Action(Go)); // .NET 4.5 新增了一个Run的方法 8 Console.WriteLine("我是Main线程 {0}", Thread.CurrentThread.ManagedThreadId.ToString()); 9 var dayName = Task.Run<string>(() => { return GetDayOfThisWeek(); }); 10 Console.WriteLine("今天是:{0}", dayName.Result); 11 Console.ReadLine(); 12 13 } 14 public static void Go() 15 { 16 Console.WriteLine("我是另一个线程 {0}", Thread.CurrentThread.ManagedThreadId.ToString()); 17 } 18 19 public static string GetDayOfThisWeek() 20 { 21 return string.Format("结果{0}", Thread.CurrentThread.ManagedThreadId.ToString()); 22 } 23 }
TaskFactory 类
- 创建一个任务,并通过调用立即启动该 StartNew 方法
任务等待
-
创建一个任务,在数组中的任务之一通过调用完成后开始 ContinueWhenAny 方法。
-
创建一个任务,在数组中的所有任务已都完成通过调用开始 ContinueWhenAll 方法。
AsyncState |
获取在创建 Task 时提供的状态对象,如果未提供,则为 null。 |
|
CompletedTask |
获取一个已成功完成的任务。 |
|
CreationOptions |
获取用于创建此任务的 TaskCreationOptions。 |
|
CurrentId |
返回当前正在执行 Task 的 ID。 |
|
Exception |
获取导致 AggregateException 提前结束的 Task。 如果 Task 成功完成或尚未引发任何异常,这将返回 null。 |
|
Factory |
提供对用于创建 Task 和 Task<TResult> 的工厂方法的访问。 |
|
Id |
获取此 Task 实例的 ID。 |
|
IsCanceled |
获取此 Task 实例是否由于被取消的原因而已完成执行。 |
|
IsCompleted |
获取此 Task 是否已完成。 |
|
IsFaulted |
获取 Task 是否由于未经处理异常的原因而完成。 |
|
Status |
获取此任务的 TaskStatus。 |
https://msdn.microsoft.com/zh-cn/library/system.threading.tasks.task(v=vs.110).aspx
当然这里并不考虑对共享数据的操作,多个线程在对同一数据源进行操作的时候,不控制顺序可能会产生意想不到的后果。