线程跟多线程跟线程池

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace WindowsFormsApplication1 {
public partial class Form1: Form {
public Form1() {
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e) {
//http://blog.csdn.net/lonet/article/details/7048616
//Thread.Suspend():挂起线程,或者如果线程已挂起,则不起作用;
//Thread.Resume():继续已挂起的线程
//Thread.Interrupt():中止处于 Wait或者Sleep或者Join 线程状态的线程
//Thread.Join():阻塞调用线程,
//Thread.Sleep():将当前线程阻塞指定的毫秒数
//Thread.Abort():以开始终止此线程的过程。如果线程已经在终止,则不能通过Thread.Start()来启动线程。
//Thread.IsAlive属性:获取一个值,该值指示当前线程的执行状态。如果此线程已启动并且尚未正常终止或中止,则为 true;否则为 false
//Thread.Name 属性:获取或设置线程的名称
//Thread.Priority 属性:获取或设置一个值,该值指示线程的调度优先级。
//Thread.ThreadState 属性:获取一个值,该值包含当前线程的状态。
//在给定的时间和指定的代码段只能被一个线程访问,Monitor 类非常适合于这种情况的线程同步
//将代码放入try…finally内,在finally调用Monitor.Exit,这样的话最后一定会释放锁。第二种方法是:利用C#的lock()方法lock(this);
//C# lock申明提供了与Monitoy.Enter和Monitoy.Exit同样的功能,这种方法用在你的代码段不能被其他独立的线程中断的情况
//Monitor.Enter 方法:在指定对象上获取排他锁
//Monitor.TryEnter 方法:试图获取指定对象的排他锁
//Monitor.Exit 方法:释放指定对象上的排他锁。
//Monitor.Wait 方法:释放对象上的锁并阻塞当前线程,直到它重新获取该锁。
//Monitor.Pulse 方法:通知等待队列中的线程锁定对象状态的更改。
//Monitor.PulseAll 方法:通知所有的等待线程对象状态的更改。
// WaitHandle类作为基类来使用的,它允许多个等待操作。这个类封装了win32的同步处理方法。WaitHandle对象通知其他的线程它需要对资源排他性的访问,其他的线程必须等待,直到WaitHandle不再使用资源和等待句柄没有被使用
//Mutex 类:同步基元也可用于进程间同步
//AutoResetEvent:通知一个或多个正在等待的线程已发生事件。无法继承此类。
//ManualResetEvent:当通知一个或多个正在等待的线程事件已发生时出现。无法继承此类。
// 这些类定义了一些信号机制使得对资源排他性访问的占有和释放。他们有两种状态:signaled 和 nonsignaled。Signaled状态的等待句柄不属于任何线程,除非是nonsignaled状态。拥有等待句柄的线程不再使用等待句柄时用set方法,其他的线程可以调用Reset方法来改变状态或者任意一个WaitHandle方法要求拥有等待句柄,这些方法见下面
//WaitAll:等待指定数组中的所有元素收到信号
//WaitAny:等待指定数组中的任一元素收到信号
//WaitOne:当在派生类中重写时,阻塞当前线程,直到当前的 WaitHandle 收到信号
//这些wait方法阻塞线程直到一个或者更多的同步对象收到信号WaitHandle对象封装等待对共享资源的独占访问权的操作系统特定的对象无论是收管代码还是非受管代码都可以使用。但是它没有Monitor使用轻便,Monitor是完全的受管代码而且对操作系统资源的使用非常有效率
//Mutex是另外一种完成线程间和跨进程同步的方法,它同时也提供进程间的同步。它允许一个线程独占共享资源的同时阻止其他线程和进程的访问
//Timer类对于周期性的在分离的线程执行任务是非常有效的,TimerCallback代表负责指定与Timer对象相关联的方法(就是要周期执行的任务)和状态。它在方法应得的时间过去之后调用一次并且周期性的调用这个方法直到调用了Dispose方法释放了Timer的所有资源。系统自动分配分离的线程。
//TimerCallback tcallback = new TimerCallback(方法);
//Timer atimer = new Timer(tcallback, null, 20, 150);
//atimer.Change(100, 300);
//atimer.Dispose();

//无参
Thread t = new Thread(new ThreadStart(shmsg1));
t.Start();
//传参数
string msg = "带参数";
Thread tt = new Thread(new ParameterizedThreadStart(shmsg2));
tt.Start(msg);
//线程池 无参 ThreadPool类时线程池将被创建。它有一个默认的上限,即每处理器最多可以有25个,调用ThreadPool.RegisterWaitForSingleObject方法来传递一个System.Threading.WaitHandle,当被通知或者时间超过了调用被System.Threading.WaitOrTimerCallback包装的方法
ThreadPool.QueueUserWorkItem(new WaitCallback(shmsg4));
ThreadPool.QueueUserWorkItem(new WaitCallback(shmsg5), "线程池 有参");
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object o) {
MessageBox.Show("线程池的匿名方法");
}));
//.使用自定义委托 6 有参
WaitCallback wc = new WaitCallback(weiw);
ThreadPool.QueueUserWorkItem(wc, "自定义委托调用线程池");
//定义委托很麻烦用这个:7 使用system.Action
WaitCallback wcc = new WaitCallback(weiww);
ThreadPool.QueueUserWorkItem(wcc, "使用system.Action");
//使用System.Func 8 Invoke调用主窗体操作之后,还希望在调用完得到一个返回值
WaitCallback w = new WaitCallback(shmsg5);
ThreadPool.QueueUserWorkItem(w, "使用system.Func");

}
//.Invoke方法签名:
//object Control.Invoke(Delegate Method);
//object Control.Invoke(Delegate Method, params object[] args);
//在业务线程里面执行完毕,要改变窗体控件的值了,此时,如果直接通过this得到控件的句柄,然后对它进行操作是会抛异常的,.Net WinForm Application里面是不允许这样的操作的。这是,可以调用Invoke方法--下面这样我会每个都定义一个委托 有点麻烦 6
private delegate void wei(string msg);
public void weiw(object o) {
this.Invoke(new wei(shmsg6), o.ToString());
}
//Action有很多个重载,可以无参数(非泛型),而最多可以有四个参数,同样采用匿名方法,不使用泛型形式的System.Action 7
public void weiww(object o) {
this.Invoke(new Action < string > (shmsg6), o.ToString());
this.Invoke(new Action(delegate() {
MessageBox.Show("第二种方式 ");
}));
}
// 带有返回值的: 8
private void w(object o) {
System.Func < string,
int > f = new Func < string,
int > (wi);
object result = this.Invoke(f, o.ToString());
MessageBox.Show(result.ToString());
}
private int wi(string o) {
if (o == "使用system.Func") {
return 1;
}
return 0;
}
//下面是各种方法
private void shmsg1() {
//加锁,让线程排队执行
lock(this) {
MessageBox.Show("第一种 无参");
}
}
private void shmsg2(object msg) {
lock(this) {
MessageBox.Show(msg.ToString());
}
}
private void shmsg3() {
//加锁,让线程排队执行
lock(this) {
MessageBox.Show("thread start ");
}
}
private void shmsg4(object o) {
//加锁,让线程排队执行
lock(this) {
MessageBox.Show("thread start ");
}
}
private void shmsg5(object o) {
//加锁,让线程排队执行
lock(this) {
MessageBox.Show(o.ToString());
}
}
private void shmsg6(string o) {
//加锁,让线程排队执行
lock(this) {
MessageBox.Show(o.ToString());
}
}
}
}

时间: 2024-10-28 12:46:50

线程跟多线程跟线程池的相关文章

Linux下简单的多线程编程--线程池的实现

/* 写在前面的话: 今天刚“开原”,选择了一篇关于线程池的文件与大家分享,希望能对您学习有所帮助,也希望能与大家共同学习! 选择在这个特殊的时候注册并发文章也是有一些我个人特殊的意义的,看我的id(西游小学生.45)就知道了,哈哈.在这里也很感谢博客园的员工,刚发申请两分钟就同意了. */ 最近由于要写一个类似于QQ的程序,所以想到要用到多线程.既然要用多线程,那何不写一个线程池?于是上网搜了搜多线程的代码,发现大多都不是很完善,或者有些小bug.所以,在这里贴出一个完整的,经过我多重测试的,

多线程和线程池

有这样一个需求:你有一个list集合,需要使用该集合作为参数,调用另一个系统并返回结果后处理它(主要的目的是处理结果) 解决方案:用线程池,不关闭线程池,将多个线程放入一个List集合中,使用invokeAll方法,相当于是将多个线程打包执行,统一返回,这样线程池可以一直不关闭,不用为了一个list开一个线程池,并且多个线程打包调用不会造成和其他用户的多线程冲突(究竟是你的线程还是我的线程). ExecutorService cachedThreadPool = Executors.newCac

java 多线程和线程池

● 多线程 多线程的概念很好理解就是多条线程同时存在,但要用好多线程确不容易,涉及到多线程间通信,多线程共用一个资源等诸多问题. 使用多线程的优缺点: 优点: 1)适当的提高程序的执行效率(多个线程同时执行). 2)适当的提高了资源利用率(CPU.内存等). 缺点: 1)占用一定的内存空间. 2)线程越多CPU的调度开销越大. 3)程序的复杂度会上升. 对于多线程的示例代码感兴趣的可以自己写Demo啦,去运行体会,下面我主要列出一些多线程的技术点. synchronized 同步块大家都比较熟悉

黑马程序员——JAVA基础之Day24 多线程 ,死锁,线程间通信 ,线程组,线程池,定时器。

------- android培训.java培训.期待与您交流! ---------- Lock()实现提供了比使用synchronized方法和语句可获得更广泛的锁定操作. private Lock lock =new ReentrantLock(); 被锁的代码要用   lock.lock()                lock.unlock()    包括.其中用try   ...finally包围 同步:效率低,如果出现同步嵌套,会出现死锁.  但是安全. 死锁问题:两个或者两个以上

C#多线程之线程池篇3

在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关知识. 五.使用等待句柄和超时 在这一小节中,我们将学习如何在线程池中实现超时和正确地实现等待.具体操作步骤如下: 1.使用Visual Studio 2015创建一个新的控制台应用程序. 2.双击打开"Program.cs"文件,编写代码如下所示: 1 using System; 2 u

C#多线程和线程池

1.概念  1.0 线程的和进程的关系以及优缺点 windows系统是一个多线程的操作系统.一个程序至少有一个进程,一个进程至少有一个线程.进程是线程的容器,一个C#客户端程序开始于一个单独的线程,CLR(公共语言运行库)为该进程创建了一个线程,该线程称为主线程.例如当我们创建一个C#控制台程序,程序的入口是Main()函数,Main()函数是始于一个主线程的.它的功能主要 是产生新的线程和执行程序.C#是一门支持多线程的编程语言,通过Thread类创建子线程,引入using System.Th

多线程及线程池学习心得

一.线程的应用与特点 多线程是程序员不可或缺的技术能力,多线程技术在各个方面都有应用,特别在性能优化上更是起到至关重要的作用.但是,如果多线程写得不好,往往会适得其反,特别是高并发时会造成阻塞.超时等现象.多线程具有以下特点:1.独立性,拥有自己独立的资源,拥有自己私有的地址空间:2.动态性,进程具有自己的生命周期和各种不同的状态:3.并发性,多个进程可以在单个处理器上并发执行,不会相互影响,并行是指同一时刻有多条指令在多个处理器上同时执行.线程是进程的组成部分,一个进程可以拥有多个线程,一个线

C#多线程之线程池篇2

在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我们将学习对于大量的异步操作,使用线程池和分别使用单独的线程在性能上有什么差异性.具体操作步骤如下: 1.使用Visual Studio 2015创建一个新的控制台应用程序. 2.双击打开"Program.cs"文件,编写代码如下所示: 1 using System; 2 using Sys

多线程,线程池与BeginInvoke()

在WinForm中,很多情况下需要用到多线程,下面我来简单介绍一下多线程的基本用法. 1.线程. (1)线程的初始化 Thread t = new Thread(new ThreadStart(ThreadProc)); 其中,ThreadStart是一个系统定义的委托,ThreadProc是一个方法的名称,其签名与ThreadStart一样. 线程的启动: (2)t.Start(); 这样子,ThreadProc方法就会执行了.t 默认是一个非主线程,并且是一个前台线程. (3)主线程等待子线