聊聊線程

說到線程,就離不開進程。

進程是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統的結構基礎。

進程是系統進行資源分配和調度的一個獨立單位。

進程一般由程序,數據集,進程控制塊三部分組成:

程序用來描述進程要完成哪些功能以及如何完成

數據集是程序在執行過程中所需要使用的資源

進程控制塊用來記錄進程的外部特徵,描述進程的執行變化過程,操作系統可以利用它來控制和管理進程,控制塊是系統感知進程存在的唯一標誌

 

因爲概念太過書面化,我越看越不明白,所以乾脆打開了任務管理器,

進程就是打開運行中的程序,有系統進程(用於完成操作系統的各種 功能),用戶進程(由自己啓動的程序)

線程

線程的出現是爲了降低上下文切換的消耗,提高系統的併發性,並突破一個進程在一個時間點只能服務一個程序的缺陷,拿到進程內併發成爲可能。

線程也叫輕量級進程 ,是一個基本的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();
        }
    }

  如果寫的哪裏有不對,還請各位指出,在下必會虛心受教 ,有錯當改,無錯加勉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章