說到線程,就離不開進程。
進程是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統的結構基礎。
進程是系統進行資源分配和調度的一個獨立單位。
進程一般由程序,數據集,進程控制塊三部分組成:
程序用來描述進程要完成哪些功能以及如何完成
數據集是程序在執行過程中所需要使用的資源
進程控制塊用來記錄進程的外部特徵,描述進程的執行變化過程,操作系統可以利用它來控制和管理進程,控制塊是系統感知進程存在的唯一標誌
因爲概念太過書面化,我越看越不明白,所以乾脆打開了任務管理器,
進程就是打開運行中的程序,有系統進程(用於完成操作系統的各種 功能),用戶進程(由自己啓動的程序)
線程
線程的出現是爲了降低上下文切換的消耗,提高系統的併發性,並突破一個進程在一個時間點只能服務一個程序的缺陷,拿到進程內併發成爲可能。
線程也叫輕量級進程 ,是一個基本的CPU執行單元,也是程序執行過程中的最小單元
線程由線程ID,程序講數器,寄存器集合和堆棧共同組成。
線程是進程的一個實體,是cpu調度和分派的基本單位,是比進程更小的能獨立運行的基本單位。
線程的引入減小了程序 併發執行時的開銷,提高了操作系統的併發性能。線程沒有自己的系統資源。
我覺得吧,進程好比你打開了一款軟件,比如網易雲音樂,這就開啓了一個進程。線程呢,好比你在網易雲裏搜索了一首想聽的歌,這就是一個線程,所以我感覺,你在一個程序裏,所做的一切操作,細化出來,其實都是一個個線程,且只所屬運行的網易雲這一個進程,系統爲網易雲(進程)分配的資源,它所有的線程共享這個進程的所有資源。
寫到這裏,我笑出了聲
好比一個集體,是一個操作系統,個體算是程序,當領導提問個體,這就打開了一個進程,這時候,要說話,要做動作,甚至表情,所以,說話時,就是一個線程,要做表情也是一個線程,而表情裏有很多表情,也是線程,當兩種以上的表情(做一個要笑也要哭的表情)就是多個進程,可是這些表情怎麼連貫呢?
就像程序中存在主線程,新開啓了線程,怎樣使兩個線程能夠協調完成一件事,例如,一個文本框,一個按鈕,主線程是整個程序,即沒有什麼操作,新開的線程是將內容通過按鈕點擊填充進文本框內,如果就這樣寫好代碼去執行,肯定會報錯這時候怎麼辦,相當於兩個線程沒有關係,還要強行建立關係,這就是不安全的,怎麼建立聯繫?中間如果有個第三方就好了,就可以爲兩者建立聯繫,這個第三方是誰呢?就是委託了。
委託是什麼??
委託就是代理,delegate,是C#重要特性之一,委託一個變量,一個方法去做一件事情。
委託就像是一箇中介,幫有需要的羣衆去協作完成自己做不到的事情。
爲什麼說協作完成,而不是完成,我覺得,委託是依靠變量,或者方法去執行指定委託。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace test1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
delegate void SetTextCallBack(string text);
private void SetText(string text)
{
if (this.textBox1.InvokeRequired)
{
SetTextCallBack stcb = new SetTextCallBack(SetText);
this.Invoke(stcb, new object[] { text });
}
else
{
this.textBox1.Text = text;
}
}
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(TEST);
thread.Start();
}
void TEST()
{
SetText(DateTime.Now.ToString());
}
}
如果此處不用到委託,或報錯:線程間操作無效: 從不是創建控件“xxx”的線程訪問它。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace test1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(TEST);
thread.Start();
}
void TEST()
{
this.textBox1.Text = DateTime.Now.ToString();
}
}
如果寫的哪裏有不對,還請各位指出,在下必會虛心受教 ,有錯當改,無錯加勉。