多线程编程(1)

为了以后忘记以后可以再看,所以记录下.

主线程

程序开始后将有一个主线程,即

Thread.CurrentThread

一个简单的示例,阻塞当前线程

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(DateTime.Now);
        Thread.Sleep(5000);
        Console.WriteLine(DateTime.Now);
    }
}

image

创建一个线程

public class Demo1
{
    private Thread thread1;
    private Thread thread2;
    public Demo1()
    {
        thread1 = new Thread(new ThreadStart(Task1));
        thread2 = new Thread(new ThreadStart(Task2));

        thread1.Start();
        thread2.Start();
    }

    public void Task1()
    {
        Console.WriteLine("Code By Developer");
    }

    public void Task2()
    {
        Console.WriteLine("Test By Tester");
    }
}

这里创建了2个线程,然后调用Start方法启动线程.

image

阻塞内部线程(非主线程)

修改上面程序,阻塞第1个线程

public void Task1()
{
    Console.WriteLine(DateTime.Now);
    Thread.Sleep(5000);
    Console.WriteLine(DateTime.Now);
    Console.WriteLine("Code By Developer");
}

public void Task2()
{
    Console.WriteLine("Test By Tester");
}

image

可以看到两个线程互不影响

为什么要使用线程

我想能不用线程就不要用,因为线程很复杂.凡事复杂的东西均隐藏在背后,一切都是为了让客户感受到更加简单。

Windows操作系统是多进程了,为什么要多进程?那么你可以一边上网,一边听歌,一边聊天。否则这3件事情你只能选择1个。你愿意怎么样的方式?

多线程也是一样,想象一下,很少人看到公司老板在写程序吧?

老板犹如公司的主程序一般,他忙不过来,必须把任务分担出去,让某某人编码,让某某人搞测试,一个公司的运作就犹如一个程序。

人是怎么做事的

若有3件事1个人的话,只能一件一件事做,无法分身。

若有3件事3个人的话,那么可以1个人做1件事。人多好办事。

OK,先不要想的太复杂,都是可以以现实生活来表达呢。抛弃难懂的理论。

线程优先级

假设你到一家餐馆,厨师负责烧菜,营业员负责端菜。营业员就端不了菜。那么厨师烧菜的优先级就要比较高.

其实比较常见的就是我们下载电影时,你肯定会挑你喜欢的看优先下载的,同时也会开着其他下载

示例代码如下

public class Demo1
{
    private Thread thread1;
    private Thread thread2;
    public Demo1()
    {
        thread1 = new Thread(new ThreadStart(Task1));
        thread2 = new Thread(new ThreadStart(Task2));
        thread1.Priority = ThreadPriority.Highest;
        thread2.Start();
        thread1.Start();
    }

    public void Task1()
    {
        for (int i = 0; i < 10; i++)
        {
            Console.WriteLine("Download Moive");
        }
    }

    public void Task2()
    {
        for (int i = 0; i < 10; i++)
        {
            Console.WriteLine("Download Book");
        }
    }
}

结果,虽然第2个线程先开始启动,但还是第1个线程的任务先完成,当然设置不同线程的优先级效果会不同

image

挂起(Suspend)和恢复(Resume)线程

  1. 你在工作的时候,在以下情况下会停下手头的工作,比如中午吃饭,上厕所.完事以后则以后回来工作.
  2. 老板有其他工作给你做,你必须把手头工作停下,完成后继续做原先的事

总而言之需要停下当前工作,之后恢复,示例如下

private Thread thread1;
public Demo1()
{
    thread1 = new Thread(new ThreadStart(Task1));
    thread1.Start();
    thread1.Suspend();
    Console.WriteLine("Stop");
    Thread.Sleep(1000);
    Console.WriteLine("Begin");
    thread1.Resume();
}

public void Task1()
{
    Console.WriteLine("Working");
}

结果

image

原文地址:https://www.cnblogs.com/Clingingboy/p/1877870.html