QQ网名大全

整理C#多线程常用的几个对象和方法

Thread 几个中要的方法
Sleep(int):静态方法,暂停当前线程指定的毫秒数
Abort():通常使用该方法来终止一个线程 ,Thread.ResetAbort() 可以恢复终止的线程
Suspend():不是终止未完成的线程,它仅仅是挂起线程,还可以恢复(已过期,但还是可以用)
Resume()://恢复被Suspend()方法挂起的线程的执行(已过期可以用)
Join():给创建一个子线程,给它加了这个方法,其它线程就会暂停执行,直到这个线程执行完为止才去执行(包括主线程),
下面的例子如果不加join()方法,两个线程和主线程是并行执行的。如加上Join()方法,就会等到执行完,再执行下面的代码
Thread threadA = new Thread(SleepMethod); //执行的必须是无返回值的方法
threadA.Name = "小A";
//threadA.Start(); ////启动线程

Thread threadB = new Thread(SleepMethod);
threadB.Name = "小B";

threadA.Start(); //启动线程

//Join通俗的说就是创建一个子线程,给它加了这个方法,其它线程就会暂停执行,直到这个线程执行完为止才去执行(包括主线程)
threadA.Join();
threadB.Start();
threadB.Join();

for (int i = 0; i < 10; i++)
{
Console.WriteLine("我是:主线程,我循环{1}次", Thread.CurrentThread.Name, i);
Thread.Sleep(300); //休眠300毫秒
}
Console.ReadKey();
Abort() 和 ResetAbort() 方法
Abort()方法是终止线程,ResetAbort()取消为当前线程请求的Thread.Abort()。
个人理解类似于Suspend()挂起线程和Resume()恢复被挂起的资源。但是 Suspend()仍会锁定被持有的锁定,其他线程不能访问被锁定的资源,当试图使用锁定的资源时,就会造成死锁。所以Suspend()既然过期了,就尽量不要使用它。
Thread thread = new Thread(ResetAbortMethod);//必须执行无返回值的方法
thread.Name = "子线程";
thread.Start();//是线程被安排执行
StringBuilder threadInfo = new StringBuilder();
threadInfo.AppendFormat(" 线程当前的执行状态:{0}", thread.IsAlive);
threadInfo.AppendFormat("\n 线程的当前的名字:{0}", thread.Name);
threadInfo.AppendFormat("\n 线程的当前等级:{0}", thread.Priority);
threadInfo.AppendFormat("\n 线程当前的状态:{0}", thread.ThreadState);

Console.WriteLine(threadInfo);
Console.ReadKey();
上面的线程调用的是下面的方法
public static void ResetAbortMethod()
{
try
{
Console.WriteLine("我是:{0},我要终止了", Thread.CurrentThread.Name);

//终止线程,后面的代码不会执行。(线程终止会引发异常ThreadAbortException,Thread.ResetAbort() )
Thread.CurrentThread.Abort();
}
catch (ThreadAbortException ex)
{
Console.WriteLine("我是:{0},我又启动了", Thread.CurrentThread.Name);

//取消为当前线程请求的 System.Threading.Thread.Abort(System.Object) ,取消后,后面的代码可以执行
Thread.ResetAbort();
}

for (int i = 0; i < 10; i++)
{
Console.WriteLine("我是:{0},我循环了{1}次", Thread.CurrentThread.Name,i);
}
}
线程安全:当一个线程访问该类的某个数据时,进行数据保护,其他线程不能进行访问知道该线程读取完毕, 其他线程才可使用。不然会出现数据的不一致性。
线程是异步执行的,为此,我需要执行同步线程。就是多个线程一个一个(one by one)的执行。
Lock就可以了实现了。
摘抄内容:
lock(this) 锁定 当前实例对象,如果有多个类实例的话,lock锁定的只是当前类实例,对其它类实例无影响。所有不推荐使用。
lock(typeof(Model))锁定的是model类的所有实例。
lock(obj)锁定的对象是全局的私有化静态变量。外部无法对该变量进行访问。
lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。
所以,lock的结果好不好,还是关键看锁的谁,如果外边能对这个谁进行修改,lock就失去了作用。所以一般情况下,使用私有的、静态的并且是只读的对象。
1、lock的是必须是引用类型的对象,string类型除外。
2、lock推荐的做法是使用静态的、只读的、私有的对象。
3、保证lock的对象在外部无法修改才有意义,如果lock的对象在外部改变了,对其他线程就会畅通无阻,失去了lock的意义。
Monitor类和Mutex类 也能实现线程同步。没有去用,没具体去看。
佚名
2024-05-20 20:45:23
最佳回答
类似问题(10)
  • 佚名
    2024-05-20 13:05:33

    C语言里用什么方法在一个线程里怎么结速另一个线程.. 。。

    C语言是线程独立的,也就是说,C语言本身是没有办法的,但是操作系统提供了API让我们完成这个工作,有很多API,比如TerminateThread,ExitTh...

  • 佚名
    2024-05-20 05:02:24

    qt环境怎么用c语言写多线程

    没必要用C语言,直接用Qthread.如果用C语言写的话就用不到QT的platform dependence了。就不用QT就可以了。如果必须要用的话linux ...

  • 佚名
    2024-05-20 16:55:49

    c语言多线程

    因为您传入的是t的地址:rc = pthread_create(&thread[t], NULL, PrintHello, &t);所以在Pri...

  • 佚名
    2024-05-20 10:11:03

    c多线程有几种实现方法

    直接使用操作系统API使用标准C++线程支持库(可跨平台)使用第三方线程库

  • 佚名
    2024-05-20 20:22:27

    c 多线程 问题

    这还不简单,是没有解决同步的问题。 操作系统执行指令是由时间片组成的。你那个变量i,又没有规定只能一个人访问。第一个线程执行了,i=0,时间片到了,轮到第二个线...

  • 佚名
    2024-05-20 23:10:57

    C语言多线程编程的一个菜鸟问题

    由于是多线程环境,放一个原子变量,每次调用该函数时,让该原子变量的值递增,同时用一个全局变量记录当该变量值为初始值时的值。不知道能明白我的意思没不用原子操作,或...

  • 佚名
    2024-05-20 19:50:21

    关于C程序设计中多进程和多线程的一道题:

    一个进程挂了,不会影响另外的进程,但是一个线程挂了,整个进程就挂了,线程切换比进程切换占用资源少。upd是无连接的,tcp是面向连接的,udp能点对点,点对多,...

  • 佚名
    2024-05-20 08:00:00
  • 佚名
    2024-05-20 08:00:00

    求 c# 创建多线程的作用和方法

    首先不是为了多线程而多线程,多线程会极大的带来额外的出错的几率。C#中第一个打开窗口的线程是主线程,也是处理UI的线程,最好保持这个线程通畅,即不要有阻塞操作,...

  • 佚名
    2024-05-20 08:00:00

    C#多线程简单例子

    这是正确的。因为新建的线程在运行前,主线程已经结束了。如果t.Start() 后有更多费时的操作的话,那可能结果是你想要的那样!