zoukankan      html  css  js  c++  java
  • 多线程编程(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

  • 相关阅读:
    Django【进阶篇-缓存类型】
    深度剖析Kubernetes API Server三部曲
    深度剖析Kubernetes API Server三部曲
    深度剖析Kubernetes API Server三部曲
    Istio技术与实践03:最佳实践之sidecar自动注入
    原来你是这样的PaaS!
    5分钟APIG实战: 使用Rust语言快速构建API能力开放
    Log4J日志配置详解
    cookie是如何保存到客户端,又是如何发送到服务端
    session cookie
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1877870.html
Copyright © 2011-2022 走看看