C# - 线程操作

代码:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading.Tasks;
  6
  7 //引用相应命名空间
  8 using System.Threading;
  9 using System.Collections;
 10
 11 namespace ThreadDemo
 12 {
 13     class ThreadDemo
 14     {
 15
 16         private Thread thread1;
 17
 18         private Thread thread2;
 19
 20         private ArrayList arraylist;
 21
 22         //删除所有数据之后,执行事件
 23         private event EventHandler OnNumberClear;
 24
 25         /// <summary>
 26         /// 构造函数
 27         /// </summary>
 28         /// <param name="Number">数字</param>
 29         public ThreadDemo(int Number)
 30         {
 31             //创建随机对象
 32             Random db = new Random(1000000);
 33
 34             //创建数组
 35             arraylist = new ArrayList(Number);
 36
 37             //循环将产生的随机数放到数组中。
 38             for (int i = 0; i < Number; i++)
 39             {
 40                 arraylist.Add(db.Next().ToString());
 41             }
 42
 43             //ThreadStart表示在此线程上调用的方法
 44             thread1 = new Thread(new ThreadStart(Run));
 45
 46             //ThreadStart表示在此线程上调用的方法
 47             thread2 = new Thread(new ThreadStart(Run));
 48
 49             OnNumberClear += ThreadDemo_OnNumberClear;
 50         }
 51
 52         /// <summary>
 53         /// 事件执完成之后,执行事件
 54         /// </summary>
 55         /// <param name="sender"></param>
 56         /// <param name="e"></param>
 57         void ThreadDemo_OnNumberClear(object sender, EventArgs e)
 58         {
 59             Console.WriteLine("执行完成,停止所有线程!");
 60             thread1.Abort();//终止线程
 61             thread2.Abort(); //终止线程
 62         }
 63
 64         /// <summary>
 65         /// 两个线程要执行的方法
 66         /// </summary>
 67         public void Run()
 68         {
 69             string stringValue = null;
 70             while (true)
 71             {
 72                 Monitor.Enter(this);//锁定,保持同步
 73                 stringValue = (string)arraylist[0];
 74                 Console.WriteLine(Thread.CurrentThread.Name + "删除了" + stringValue);
 75                 arraylist.RemoveAt(0);//删除ArrayList中的元素
 76                 if (arraylist.Count == 0)
 77                 {
 78                     OnNumberClear(this, new EventArgs());//引发完成事件
 79                 }
 80                 Monitor.Exit(this);//取消锁定
 81                 Thread.Sleep(5);
 82             }
 83         }
 84
 85         /// <summary>
 86         /// 启动两个线程
 87         /// </summary>
 88         public void Active()
 89         {
 90
 91             thread1.Start();
 92             thread2.Start();
 93         }
 94
 95
 96         /// <summary>
 97         /// Main
 98         /// </summary>
 99         public static void Main()
100         {
101             ThreadDemo th = new ThreadDemo(200);
102
103             th.Active();
104         }
105     }
106 }
时间: 2024-09-26 22:28:35

C# - 线程操作的相关文章

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;  

线程操作范例

实例要求: 设计一个线程操作类,要求可以产生三个线程对象,并可以分别设置三个线程的休眠时间.如下所示: 问怎么设计? 分析 从之前学习知道,线程的实现有两种方式,一种是继承Thread类,另一种是实现Runnable接口.而且类中应保存线程名称和休眠时间属性. 1,通过Thread类实现. 在Thread类中直接存在name属性.所以不用定义name属性,直接在子类构造方法通过super(name)方法设置即可. class MyThread extends Thread{ private in