zoukankan      html  css  js  c++  java
  • 步步为营-64-进程&线程

    1 进程

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 进程线程
    {
        class Program
        {
            static void Main(string[] args)
            {
                //获取当前进程
                Process p1 = Process.GetCurrentProcess();
                Console.WriteLine(p1.Id);
                Console.WriteLine(p1.ProcessName);
    
                //打开新的进程
                Process p2 = Process.Start("cmd.exe");
                string  key = Console.ReadLine();
                if (key=="k")
                {
                    //杀死进程
                    p2.Kill();
                }
                Console.ReadLine();
    
    
            }
        }
    }
    View Code

    2 应用程序域

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 应用程序域
    {
        class Program
        {
            static void Main(string[] args)
            {
                //01 获取当前应用程序域
                AppDomain ad = AppDomain.CurrentDomain;
                Console.WriteLine(ad.FriendlyName);
                //02 在当前程序域中打开程序集,不会开启新进程
                AppDomain ap2= AppDomain.CreateDomain("xyxtl");
               int id = ap2.ExecuteAssembly("进程线程.exe");
                Console.Write(id);
    
               Console.ReadKey();
            }
        }
    }
    View Code

    3 线程

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace 线程
    {
        class Program
        {
            static void Main(string[] args)
            {
                #region 01 获取当前线程-默认程序启动后,会有一个主线程
                Thread t1 = Thread.CurrentThread;
                Console.WriteLine(t1.ManagedThreadId);
                #endregion
    
    
                #region 02 开辟一个新线程 - 02-01 无参;02-02 有参
                //02-01 有参
                Thread t2 = new Thread(() =>
                {
                    Console.WriteLine(Thread.CurrentThread.ManagedThreadId);//输出当前线程编号
                    Console.WriteLine("无参,构造函数!");
                });
                t2.Start();
    
                //02-02 有参
                #endregion
    
                Thread t3 = new Thread((p) =>
                {
                    //由于参数是object类型,如果想访问对象特有成员,需要进行类型转换
                    Person p2 = p as Person;
                    if (p2!=null)
                    {
                        ;
                        Console.WriteLine(p2.Age);
                    }
                    
                    Console.WriteLine(p.ToString());
                });
                t3.Start(new Person()
                {
                    Name = "张三",
                    Age = 18,
                });
                Console.Read();
            }
    
            public class  Person
            {
                public string Name { get; set; }
                public int Age { get; set; }
    
                public override string ToString()
                {
                    return string.Format("姓名:{0},年龄{1}",Name,Age);
                }
            }
        }
    }
    View Code

    3.2 IsBackground属性

    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 前台线程与后台线程
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Thread t1 = new Thread(() =>
                {
                    while (true)
                    {
                        Console.WriteLine(1);
                    }
                });
                //休息5秒
               // Thread.Sleep(5000);
               
                t1.Start();
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                Thread t1 = new Thread(() =>
                {
                    while (true)
                    {
                        Console.WriteLine(2);
                    }
                });
                t1.IsBackground = true;
                t1.Start();
            }
        }
    }
    View Code

    当线程是后台线程时,主线程关闭,后台线程也随之关闭;
    当线程是前台线程时,主线程关闭,前台线程不关闭;

    3.3 join 属性,阻塞join代码所在的当前线程==插队

    4 lock

    问题的引出

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace Lock锁
    {
        class Program
        {
            static void Main(string[] args)
            {
                int num = 0;
                
                Thread th = new Thread(() =>
                {
                    for (int i = 0; i < 10000000; i++)
                    {
                        num--;
                    }
                });
                th.IsBackground = true;
                th.Start();
    
                for (int i = 0; i < 10000000; i++)
                {
                    num++;
                }
    
                Console.WriteLine(num);
                Console.ReadKey();
            }
        }
    }
    View Code

    解决方法:加锁

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace Lock锁
    {
        class Program
        {
            static void Main(string[] args)
            {
                int num = 0;
                
                Thread th = new Thread(() =>
                {
                    for (int i = 0; i < 10000000; i++)
                    {
                        lock ("B")
                        {
                            num --; 
                        }
                    }
                });
                th.IsBackground = true;
                th.Start();
    
                for (int i = 0; i < 10000000; i++)
                {
                    lock ("B")
                    {
                        num ++;
                    }
                }
    
                Console.WriteLine(num);
                Console.ReadKey();
            }
        }
    }
    View Code

     5 栈 stack

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 栈
    {
        class Program
        {
            static void Main(string[] args)
            {
                //定义栈
                Stack<BaoZi> bzStack = new Stack<BaoZi>( );
                //入栈
                bzStack.Push(new BaoZi());
                //出栈
                if (bzStack.Count>0)
                {
                   BaoZi bz= bzStack.Pop();
                }
    
            }
    
            public class BaoZi 
            {
            }
        }
    }
    View Code

    6 线程池

      线程池中的线程都是后台线程

      不能手动设置每个线程的属性(前台,优先级)

      比较短的任务考虑线程池,比较长的任务考虑手动创建一个线程

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace 线程池
    {
        class Program
        {
            static void Main(string[] args)
            {
                for (int i = 0; i < 10; i++)
                {
                    ThreadPool.QueueUserWorkItem((obj) =>
                        {
                            Console.WriteLine(obj+"_"+Thread.CurrentThread.ManagedThreadId);
                            Thread.Sleep(100);
                        },i
                        );
                }
                Console.Read();
            }
        }
    }
    View Code

    7 异步方式调用委托对象

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace 异步方式调用委托对象
    {
        class Program
        {
            static void Main(string[] args)
            {
                //定义一个委托
                Action<string> s1 = (s) =>
                {
                    Console.WriteLine(s+"_"+ Thread.CurrentThread.ManagedThreadId);
                };
                //委托的实现-01
                //s1("张三");
                //委托的实现-02 异步调用实现委托
                s1.BeginInvoke("张三",Func1,"");
    
                //获取主线程id 
                Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
                
                Console.ReadKey();
            }
    
            #region 委托实现后的回调函数
            private static void Func1(IAsyncResult ar)
            {
                Console.WriteLine("李四"+"_"+Thread.CurrentThread.ManagedThreadId);
            } 
            #endregion
        }
    }
    View Code

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace 异步方式调用委托对象
    {
        class Program
        {
            static void Main(string[] args)
            {
                //定义一个委托
                Action<string> s1 = (s) =>
                {
                    Console.WriteLine(s+"_"+ Thread.CurrentThread.ManagedThreadId);
                };
                //委托的实现-01
                //s1("张三");
                //委托的实现-02 异步调用实现委托
               IAsyncResult result = s1.BeginInvoke("张三",Func1,"");
                //保证委托执行完成后,执行后续代码
                //只保证委托执行完成,不保证回调函数也执行完成
                s1.EndInvoke(result);
    
                //获取主线程id 
                Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
                
                Console.ReadKey();
            }
    
            #region 委托实现后的回调函数
            private static void Func1(IAsyncResult ar)
            {
                Console.WriteLine("李四"+"_"+Thread.CurrentThread.ManagedThreadId);
            } 
            #endregion
        }
    }
    View Code

    8 并行计算

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 并行计算
    {
        class Program
        {
            static void Main(string[] args)
            {
                Stopwatch  sp = new Stopwatch();
                sp.Start();
                //普通计算
                //for (int i = 0; i < 100000; i++)
                //{
                //    Console.WriteLine(i);
                //}
                //并行计算
                Parallel.For(1, 100000, (i) => { Console.WriteLine(i); });
                sp.Stop();
                Console.WriteLine(sp.Elapsed);
                Console.ReadKey();
            }
        }
    }
    View Code

  • 相关阅读:
    97. Interleaving String
    96. Unique Binary Search Trees
    95. Unique Binary Search Trees II
    94. Binary Tree Inorder Traversal
    odoo many2many字段 指定打开的form视图
    docker sentry 配置文件位置
    postgres 计算时差
    postgres 字符操作补位,字符切割
    postgres判断字符串是否为时间,数字
    odoo fields_view_get
  • 原文地址:https://www.cnblogs.com/YK2012/p/6918111.html
Copyright © 2011-2022 走看看