线程操作若干(复习)

lock关键 (lock的本质就是Monitor,另外Monitor,Mutex也是排它锁,相比之下Mutex是夸进程的)

1  lock(this)
2 {
3         Callback(" A-" + count.ToString());
4 }

ILspy下看到的

 1 bool flag = false;
 2 try
 3 {
 4     Monitor.Enter(this, ref flag);
 5     this.Callback(" A-" + i.ToString());
 6 }
 7 finally
 8 {
 9     if (flag)
10     {
11         Monitor.Exit(this);
12     }
13 }

Task取消

 1                 CancellationTokenSource tokenSource = new CancellationTokenSource();
 2                 CancellationToken token = tokenSource.Token;
 3                 Task task = new Task(() =>
 4                 {
 5                     try
 6                     {
 7                         for (int i = 0; i < int.MaxValue; i++)
 8                         {
 9                             if (token.IsCancellationRequested)
10                             {
11                                 Console.WriteLine("task is cancel");
12                                 token.ThrowIfCancellationRequested();
13                             }
14                             else
15                             {
16                                 Console.WriteLine("Int value {0}", i);
17                             }
18                         }
19                     }
20                     catch(OperationCanceledException)
21                     {
22                         Console.WriteLine("cancelling task callback");
23                     }
24                 }, token);
25
26                 Console.WriteLine("Press enter to start task");
27                 Console.WriteLine("Press enter again to cancel task");
28                 Console.ReadKey();
29                 task.Start();
30
31                 Console.ReadKey();
32                 tokenSource.Cancel();

For 线程取消

 Task并行

1  static void  DoAction(int i)
2  {
3             Thread.Sleep(300* i);
4             Console.WriteLine("msg:" + i.ToString());
5  }
6
7   Parallel.For(0, 10, i => DoAction(i));

Task串行

 1       static int Task1(object state)
 2         {
 3             int i = (int)state;
 4
 5             Thread.Sleep(100* (10-i));
 6             Console.WriteLine("task1:" + i.ToString());
 7             i += 1;
 8             return i;
 9         }
10
11         static int Task2(Task<int> t)
12         {
13             var i = t.Result;
14             Console.WriteLine("task2:" + i.ToString());
15             Thread.Sleep(100*(11-i));
16             i *= 10;
17             return i;
18         }
19
20         static Task<int> MergerTask(object input)
21         {
22             Task<int> t = new Task<int>(Task1, input);
23             var t2 = t.ContinueWith<int>(Task2);
24             t.Start();
25             return t2;
26         }
27
28         static async void DoTask(int input)
29         {
30             var result= await MergerTask(input);
31             Console.WriteLine("merger-task:"+ input +" result: "+ result);
32         }    

调用

1 for (int i = 1; i < 10; i++)
2 {
3           DoTask(i);
4 }

线程量行--Semaphore  限制同一时间内只能跑几个线程,用于排队类型

 1         static Semaphore _sem = new Semaphore(3, 3);
 2         static void Enter(object id)
 3         {
 4             Console.WriteLine(id + " waitting...");
 5             _sem.WaitOne();
 6             Console.WriteLine(id + " is in!");
 7             Thread.Sleep(1000 * (int)id);
 8             Console.WriteLine(id + " is leaving");
 9             _sem.Release();
10         }

调用

1  for (int i = 1; i <= 10; i++)
2   {
3           new Thread(Enter).Start(i);
4    }
时间: 2024-10-08 04:24:16

线程操作若干(复习)的相关文章

C#跨线程操作控件的最简单实现探究

随着程序复杂度的提高,程序不可避免会出现多个线程,此时就很可能存在跨线程操作控件的问题. 跨线程操作UI控件主要有三类方式: 1.禁止系统的线程间操作检查.(此法不建议使用) 2.使用Invoke(同步)或者BeginInvoke(异步).(使用委托实现,并用lambda表达式简化代码) 3.使用BackgroundWorker组件.(此法暂不介绍,详情可见文末的参考资料) 先看一个跨线程操作失败的例子: 新建一个Winform窗口程序项目,拖一个button1和label1控件到Form1窗体

java线程操作范例

一:线程操作范例(1) package com.cloud.day6; public class Demo1 { publicstatic void main(String[] args) { MyThreadmt1=new MyThread("线程A", 1000); MyThreadmt2=new MyThread("线程B", 2000); MyThreadmt3=new MyThread("线程C", 3000); mt1.start()

线程基础:线程(2)——JAVA中的基本线程操作(上)

文章注明来源:http://blog.csdn.net/yinwenjie,主要供自己学习转载用 1.JAVA中线程的状态 1-1.#对象锁 在Java中每一个对象都有一把‘锁’,这个‘锁’可以是开放状态:也可以由某一个线程(或者多个线程)持有‘钥匙’:一旦在系统中某个对象的‘锁’存在至少一把‘钥匙’,那么任何线程操作这个对象,都必须验证是否有‘钥匙’,如果没有则会报IllegalMonitorStateException异常. 可是‘锁芯’(对象独占权)只有一个,那么可以打开这把锁的多个‘钥匙

线程操作学习20150905

1. ThreadPool 提供线程池的管理 ThreadPool是静态类,无构造函数,其方法都是静态. a) 主要使用的方法是: QueueUserWorkItem方法 public static bool QueueUserWorkItem(WaitCallback callBack): 将方法排入队列以便执行.此方法在有线程池线程变得可用时执行. public static bool QueueUserWorkItem(WaitCallback callBack,Object state)

C#中利用委托实现多线程跨线程操作

在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了保证线程安全以及提高代码的效率所做的改进,但是也给大家带来很多不便. 其实解决这个问题有两种方法:一,是通过设置System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;在你的程序初始化的时候设置了这个属性,而且在你的控件中使用的都是微软Framework类库中的控件的话,系统就不会再抛出你上面所说的

线程操作

//终止thread1线程 thread1.Abort(); //主线程挂起等待,直到thread1完全终止 thread1.Join(); //thread1线程已终止,主线程继续执行 Abort执行后线程并没有立即结束,线程在被终止之前立即进入AbortRequested状态,所以才会有你遇到的问题"线程正在运行或未被终止:它无法重新启动." 建议"在触发事件重新开启线程"前调用Join等待线程真正终止. 在abort之后线程销毁了,重新开启线程的时候没有从新实

iOS子线程操作UI问题检查

iOS开发中,因为大部分函数都不是线程安全的,所以UI子线程中操作UI是非常危险的事,但是有时候因为开发者经验不足,不知道子线程中不能UI,或者知道但是写代码的时候没注意,或者不知道那些函数操作UI了(比如UITableView的reload函数),造成这个问题时常发生,防不胜防,而且iOS不像安卓,一旦子线程中操作UI就直接崩溃,iOS中操作UI只是有可能崩,导致问题经常不好重现,而且经常奔溃堆栈是乱的,找不到出错的地方在哪儿,十分头疼. 本人写了一个简单的线程检查ui操作的库,当子线程操作u

线程基础:线程(3)——JAVA中的基本线程操作(中)

(接上文<线程基础:线程(2)--JAVA中的基本线程操作(上)>) 1-4.注意synchronized关键字的使用 在前面的文章中我们主要讲解的是线程中"对象锁"的工作原理和操作方式.在讲解synchronized关键字的时候,我们还提到了synchronized关键字可以标注的位置.大家经常看到相当部分的网贴,在它们的代码示例中将synchronized关键字加载到代码的方法体上,然后告诉读者:这个操作是线程安全的.代码可能如下: /** * 这个类的class对象进

4.QT中进程操作,线程操作

 QT中的线程操作 T19Process.pro SOURCES += \ main.cpp CONFIG += C++11 main.cpp #include <QCoreApplication> #include <QProcess> #include <QDebug> int main(int argc, char** argv) {     QCoreApplication app(argc, argv);       QProcess process;