【ITOO】--不知道多執行緒你就就out了
還在為所做的系統載入過慢,過卡而發愁嗎?不知道多執行緒,你就out了。最近用了大概兩三天的時間,研究多執行緒。通過小組的交流,對多執行緒有了更加深入的思考。希望能夠加到ITOO專案裡面,優化一下系統效能。
概念
執行緒是程式中的一個單一的順序控制流。程式內一個相對獨立,可排程的執行單元件,是系統獨立排程和分派CPU的基本單位值執行總的程式的排程單位。在單個程式中同時執行多個執行緒完成不同的工作,稱為多執行緒。
基礎
執行緒需要引入.NET程式集System.Threading;上面寫了一個簡單執行緒的狀態和狀態之間轉換需要呼叫的方法。幾個常用的屬性、方法:
如果希望看的更加詳細,還可以訪問MSDN
例項
用.Net最基礎啟多執行緒的方式,完成一個求100之內有多少個素數的多執行緒Demo。比如一個執行緒求1~10之內的素數個數,另一個執行緒求11~20之內的素數個數……然後將結果彙總,輸出最終結果。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ThreadMethod
{
class Program
{
static void Main(string[] args)
{
//例項化一個陣列
List<int> list = new List<int>();
//開啟一個執行緒,執行緒引數就是list.AddRange(GetZhishu(1,10)),返回值也為list.AddRange(GetZhishu(1,10))
Thread t = new Thread(() =>
{
list.AddRange(GetZhishu(1, 10));
});
//開啟執行緒T
t.Start();
Thread t1 = new Thread(() =>
{
list.AddRange(GetZhishu(10, 20));
});
t1.Start();
Thread t2 = new Thread(() =>
{
list.AddRange(GetZhishu(20, 30));
});
t2.Start();
Thread t3 = new Thread(() =>
{
list.AddRange(GetZhishu(30, 40));
});
t3.Start();
Thread t4 = new Thread(() =>
{
list.AddRange(GetZhishu(40, 50));
});
t4.Start();
Thread t5 = new Thread(() =>
{
list.AddRange(GetZhishu(50, 60));
});
t5.Start();
Thread t6 = new Thread(() =>
{
list.AddRange(GetZhishu(60, 70));
});
t6.Start();
Thread t7 = new Thread(() =>
{
list.AddRange(GetZhishu(70, 80));
});
t7.Start();
Thread t8 = new Thread(() =>
{
list.AddRange(GetZhishu(80, 90));
});
t8.Start();
Thread t9 = new Thread(() =>
{
list.AddRange(GetZhishu(90, 100));
});
t9.Start();
//執行緒休眠0.1s
Thread.Sleep(100);
//迴圈陣列list,並列印
foreach (var item in list)
{
Console.WriteLine(item);
}
Console.Read();
}
/// <summary>
/// 獲取質數的方法
/// </summary>
/// <param name="start">獲取質數範圍的起始值</param>
/// <param name="end">獲取質數範圍的終止值</param>
/// <returns>質數的List集合</returns>
static List<int> GetZhishu(int start, int end)
{
int i, j; //定義兩個變數i,j
List<int> list = new List<int>();//例項化int型別的list集合
//質數除1和本身不能被其他數整除,讓每個數除以它一半以前的數,如果不能被前半段整除,就肯定不能被後半段整除,把結果新增到list集合裡面
for (i = start; i < end; i++)
{
for (j = 2; j <= i / 2; j++)
{
if (i % j == 0)
break;
}
if (j > i / 2)
list.Add(i);
}
return list;
}
}
}
思路就是首先開啟10個執行緒,分為十個不同的資料段,然後每個執行緒都通過Lambda式將委託的方法當做引數傳入到執行緒裡面。傳入完成後,執行緒休眠0.1s,然後通過迴圈列印輸出結果。 寫的演算法還有點小缺陷,2,3也為質數,沒能加到演算法裡面,還有待改進。
擴充
Java和.NET的多執行緒基本類似,不過Java跟.NET執行緒也有不同的地方,Java種的Fork/Join框架是將一根任務分解成不同的執行緒來執行,一個執行緒執行完成後,還可以幫助其他的執行緒執行任務。但是在.NET這邊更加側重執行緒的安全性,不允許訪問其他的執行緒。
多執行緒、分散式都體現了一種分治的思想,把複雜問題簡單化,大任務分解成小任務。另外執行緒裡面的鎖和分散式事務結合起來。比方說,兩個人同時取同一張銀行卡的錢,多執行緒可以給該執行緒加鎖,防止其他的執行緒進入,造成透支。如果進行轉賬操作,A賬戶錢減少,B賬戶錢增加,必須做成事務,保證資料的一致性。
另外多執行緒也不一定意味著高效。執行緒之間的資源是可以共享的,如果開啟的執行緒過多,就像一個超市的打包的員工,同時為2個收銀員打包,效率還不錯;要是同時為200個收銀員服務,那跑路的時間就很奢侈了。
多執行緒的適用範圍:1.不阻斷主執行緒,實現即時響應,由後臺執行緒完成即時操作 2.多個執行緒,完成同類任務,提高併發性 3.一個任務多個步驟,多執行緒執行各自任務。
總結
總以為自己跟大牛的差距很大,不要以為完了就算了,用行動來證明團隊的力量是偉大的。
相關文章
- 關於iOS多執行緒,你看我就夠了iOS執行緒
- 細說 Android 下的多執行緒,學會了多執行緒,你就學會了壓榨CPU!Android執行緒
- 看了這個有趣的例子,你就秒懂多執行緒同步了執行緒
- iOS底層原理 多執行緒之GCD 看我就夠了 --(10)iOS執行緒GC
- 快速瞭解Java多執行緒,有這一篇就夠了Java執行緒
- Java多執行緒超級詳解(只看這篇就夠了)Java執行緒
- 趕快看看Java11,不然你就out了!Java
- 你不知道的的 iOS 多執行緒iOS執行緒
- 是兄弟!就來看這篇多執行緒!叄執行緒
- python 多執行緒就這麼簡單(續)Python執行緒
- 多執行緒,你覺得你安全了?(執行緒安全問題)執行緒
- 如果你不知道這11款常見的Web應用程式框架,就說明你out了Web框架
- 如果你不知道這11款常見的Web應用程式框架 就說明你out了Web框架
- [Istio是什麼?] 還不知道你就out了,一文40分鐘快速理解
- 看完這篇多執行緒,再說多執行緒學不會,那你就收藏多看兩遍執行緒
- 2016年這9大開發趨勢預測你還不知道就out了
- 你還上“百度”搜專業資料嗎?你就OUT了!!!!
- 大資料時代,再不學習就OUT了大資料
- 新手一看就懂的執行緒池!執行緒
- 多執行緒必考的「生產者 - 消費者」模型,看齊姐這篇文章就夠了執行緒模型
- 老闆:kill -9 的原理都不知道就敢去線上執行?明天不用來了!
- 面試題-關於Java執行緒池一篇文章就夠了面試題Java執行緒
- 執行緒池的基本原理,看完就懂了執行緒
- 關於Jmeter執行緒組的設定,看這一篇就夠了JMeter執行緒
- 一看就懂的python小程式-支援多執行緒聊天例項Python執行緒
- 多執行緒和多執行緒同步執行緒
- 執行緒、多執行緒和執行緒池,看完這些你就能全部搞懂了執行緒
- 多執行緒執行順序詭異現象談,你不知道的pthread_create執行緒thread
- 多執行緒【執行緒池】執行緒
- 多執行緒--執行緒管理執行緒
- Java多執行緒——執行緒Java執行緒
- 執行緒與多執行緒執行緒
- 微信小程式執行流程看這篇就夠了微信小程式
- VC多執行緒 C++ 多執行緒執行緒C++
- Python高手都知道的內建函式,你不知道就low了Python函式
- 多執行緒-執行緒控制之休眠執行緒執行緒
- 多執行緒-執行緒控制之加入執行緒執行緒
- 多執行緒-執行緒控制之禮讓執行緒執行緒