1.多线程简单使用
(1)进程是不执行代码的,执行代码的是线程,一个进程默认有一个线程
(2)线程默认情况下都是前台线程,要所有的前台线程退出以后程序才会退出,进程里默认的线程我们叫做主线程或者叫做UI线程
(3)线程什么时候结束?如果线程是前台线程,该线程执行的方法执行完以后线程就会自动退出
(4)后台线程只要所有的前台线程结束,后台线程就会立即结束
(5)多个线程访问同一资源,可能造成不同步的情况,这个叫做线程重入,可以使用lock加锁将执行的共同方法中的代码加上lock
(6)thread.Abort();//强行停止线程
Thread.Sleep(5000);//将当前线程暂停5秒
Thread th = Thread.CurrentThread;//获得当前运行代码的线程
th.Name="线程名字"
(7)简单使用
//创建一个线程对象,并为这个线程对象指定要执行的方法
Thread thread = new Thread(Test);
//设置线程为后台线程
thread.IsBackground = true;
//开启线程
thread.Start();
private void Test()
{
Console.Write("多线程测试方法");
}
线程调用带参数的方法
static void ParameterizedThread(object obj)
{
Console.WriteLine(obj.ToString());
}
ParameterizedThreadStart pts = new ParameterizedThreadStart(ParameterizedThread);
Thread t = new Thread(pts);
t.IsBackground = true;
t.Start("我是带参数的线程");
(8)lock的本质就是调用以下代码
private static readonly object obj = new object();
bool isGetLocker = false;
try
{
Monitor.Enter(obj,ref isGetLocker);//获取指定对象上的排它锁,可获取一个值,指示是否获取了该锁
//尝试获取锁,如果获取成功,isGetLocker=true
}
catch(Exception ex)
{
throw ex;
}
finally
{
if(isGetLocker)
{
Monitor.Exit(obj);//释放对象上的排它锁
}
}
2.线程死锁
static object locker1 = new object();
static object locker2 = new object();

public static void MainThread()
{
new Thread(() =>
{
lock (locker1) //获取锁locker1
{
Thread.Sleep(1000);
lock (locker2) //尝试获取locker2
{
Console.WriteLine("locker1,locker2");
}
}
}).Start();
new Thread(() =>
{
lock (locker2) //获取锁locker2
{
Thread.Sleep(1000);
lock (locker1) //尝试获取locker1
{
Console.WriteLine("locker2,locker1");
}
}
}).Start();
}

3.线程通信 生产者消费者模式
所谓生产者消费者模式就是生产一个对象,然后在消费一个对象,线程通信主要是通过Monitor这个类来进行通信的
public class Dog
{
public static object objLock = new object();
public string name;
public string gender;
}

public class Factory
{

private Dog myDog;
public Factory(Dog d)
{
myDog = d;
}
public void Change()
{
int i = 0;
while (true)
{
lock (Dog.objLock)
{
if (i == 0)
{
myDog.name = "ruiky";
myDog.gender = "Male";
}
else
{
myDog.name = "瑞奇";
myDog.gender = "Female";
}
i = (i + 1) % 2;
Monitor.Pulse(Dog.objLock);//通知等待队列中的线程锁定对象状态的更改,激活等待队列中
//和锁相关的线程
Monitor.Wait(Dog.objLock);//释放对象上的锁并阻止当前线程,直到它重新获取该锁
}
}
}
}

public class Customer
{
private Dog myDog;
public Customer(Dog d)
{
myDog = d;
}
public void Buy()
{
while (true)
{
lock (Dog.objLock)
{
Console.WriteLine(myDog.name + " , " + myDog.gender);
Monitor.Pulse(Dog.objLock);
Monitor.Wait(Dog.objLock);
}
}
}
}
//------------------------------
public static void Main(string[] ar)
{
Dog d = new Dog();
Factory f = new Factory(d);
Thread thrF = new Thread(f.Change);
thrF.IsBackground = true;
Customer c = new Customer(d);
Thread thrC = new Thread(c.Buy);
thrC.IsBackground = true;

thrF.Start();
thrC.Start();
Console.ReadLine();
thrC.Abort();
thrF.Abort();
Console.ReadLine();
}

4.线程Join()方法
Thread t = new Thread(aa);//aa()方法去执行其他代码
t.IsBackground = true;
t.Start();
t.Join();//强制阻断其他线程执行,先执行当前线程
Console.WriteLine("方法执行完毕");//这句代码会等到t这个线程执行完毕后才执行
以上代码如果被另外一个线程调用时,t.Join()会阻断另外一个线程,等到t这个线程执行完毕后才执行

5.委托的简单实用
委托是用来保存一个方法的指针的
如果方法的指针要被委托对象保存,那么这个方法的签名要和委托的签名一样。
实用+=为委托对象追加方法
public delegate void SayHi();
SayHi s = new SayHi(Test);
s+=Test1;
s-=Test;
s();

6.GDI(图形设计接口)常用的方法
//从panel1控件上创建一个画家Graphics对象
using (Graphics g = Graphics.FromHwnd(this.panel1.Handle))
{
//g.DrawEllipse(Pens.Black, new Rectangle(0, 0, 100, 100));//画一个椭圆
//g.DrawLine(Pens.Yellow, 10, 10, 100, 100);//画一条线
//g.DrawArc(Pens.Black, new Rectangle(0, 0, 100, 100), 90, 90);//画一条弧线
//g.DrawRectangle(Pens.Black,new Rectangle(0,0,100,200));//画一个矩形
//g.DrawString("我是要写的字", new Font("微软雅黑", 12), new SolidBrush(Color.Red), new
PointF(10, 10));
//g.FillEllipse(Brushes.Red, new Rectangle(0, 0, 100, 100));//用红色填充椭圆

}
//画水印
using (Image img = new Bitmap(@"E:\1.JPG"))
{
using (Graphics g = Graphics.FromImage(img))
{
using (Image img1 = new Bitmap(@"E:\3.jpg"))
{
g.DrawImage(img1, 120, 177);
}
//g.DrawString("帅哥", new Font("微软雅黑", 30), new SolidBrush(Color.Red), new
PointF(10, 10));
img.Save(@"E:\2.jpg");
}
}

.net学习之多线程、线程死锁、线程通信 生产者消费者模式、委托的简单使用、GDI(图形设计接口)常用的方法的更多相关文章

  1. Java多线程-同步:synchronized 和线程通信:生产者消费者模式

    大家伙周末愉快,小乐又来给大家献上技术大餐.上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式. 一.同 ...

  2. Java 学习笔记 使用并发包ReentrantLock简化生产者消费者模式代码

    说明 ReentrantLock是java官方的一个线程锁类,ReentarntLock实现了Lock的接口 我们只需要使用这个,就可以不用使用synchronized同步关键字以及对应的notify ...

  3. python进阶:Python进程、线程、队列、生产者/消费者模式、协程

    一.进程和线程的基本理解 1.进程 程序是由指令和数据组成的,编译为二进制格式后在硬盘存储,程序启动的过程是将二进制数据加载进内存,这个启动了的程序就称作进程(可简单理解为进行中的程序).例如打开一个 ...

  4. python 多线程笔记(5)-- 生产者/消费者模式

    我们已经知道,对公共资源进行互斥访问,可以使用Lock上锁,或者使用RLock去重入锁. 但是这些都只是方便于处理简单的同步现象,我们甚至还不能很合理的去解决使用Lock锁带来的死锁问题. 要解决更复 ...

  5. python 多线程笔记(6)-- 生产者/消费者模式(续)

    用 threading.Event() 也可以实现生产者/消费者模式 (自己拍脑袋想出来的,无法知道其正确性,请大神告知为谢!) import threading import time import ...

  6. 【多线程】java多线程实现生产者消费者模式

    思考问题: 1.为什么用wait()+notify()实现生产者消费者模式? wait()方法可以暂停线程,并释放对象锁 notify()方法可以唤醒需要该对象锁的其他线程,并在执行完后续步骤,到了s ...

  7. Java多线程_生产者消费者模式2

    在我的上一条博客中,已经介绍到了多线程的经典案列——生产者消费者模式,但是在上篇中用的是传统的麻烦的非阻塞队列实现的.在这篇博客中我将介绍另一种方式就是:用阻塞队列完成生产者消费者模式,可以使用多种阻 ...

  8. java多线程:线程间通信——生产者消费者模型

    一.背景 && 定义 多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步. 另一个问题是,多个线程之间如何协作呢? 我们看一个仓库 ...

  9. 第23章 java线程通信——生产者/消费者模型案例

    第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...

随机推荐

  1. mvc 简单笔记

    ---恢复内容开始--- 入口文件 index.php 唯一的一个让浏览器直接请求的脚本文件 控制器 协调模型和试图 模型 提供数据 保存数据 数据的验证 试图 只负责显示 <?php $c = ...

  2. SSH整合之spring整合struts2(续上)

    一.项目结构 二.新建UserAction,继承自ActionSupport,并实现ModelDriven<User>接口:getModel方法是用来装配对象属性的:注意,userServ ...

  3. 回顾bidirectional path tracing

    最近因为研究需要,回顾了一下BDPT,主要看VEACH的那篇论文,同时参考了pbrt,mitsuba的实现,自己写了一份新的bdpt实现.以前实现的那一份BDPT不是基于物理的,而且无法处理镜面和透明 ...

  4. iOS-使用Xcode拉伸图片

    如果要制作一个类似于QQ消息气泡的图片,该如何制作呢?android中可以使用.9图片指定图片中的某一部分拉伸,那iOS中类似的功能要如何实现呢,Xcode提供了类似的功能.具体步骤如下: 1.选择需 ...

  5. Ubuntu 中软件的安装、卸载以及查看的方法总结

    Ubuntu 中软件的安装.卸载以及查看的方法总结 博客分类: Linux UbuntuDebian配置管理CacheF#  说明:由于图形化界面方法(如Add/Remove... 和Synaptic ...

  6. 我的css释疑-float line-height inline-block vertical-align

    markdown的图片和链接格式相类似: [链接文字/图片的alt text] (链接地址/ 图片的地址), 只是图片要在前面加上感叹号! 当内容中含有图片的时候,如果图片的高度大于行高,则含有图片 ...

  7. 利用SecureCRT上传、下载文件(使用sz与rz命令)

    sz用法: 下载一个文件 sz filename 下载多个文件 sz filename1 filename2 下载dir目录下的所有文件,不包含dir下的文件夹 sz dir/* 下载文件存放位置在s ...

  8. 看了让人笑了很多很多次的NB的痔疮经历

    前言 这篇杂记其实是去年也就是 2013年9月30日转载的,后来在整理博客分类时七弄八弄误删掉了好多文章,就包括这一篇.今天,2014年9月29日,恰好恰好一年的时候居然在好久未登陆的 OneNote ...

  9. Dialog类介绍

    Dialog类实现为一个简单的漂浮窗口,完全在Activity中创建.使用基本的Dialog类,你可以创建一个新的实例并设定标题和布局,如下所示: Dialog d = new Dialog(MyAc ...

  10. 关于ruby重构的过程中去除不必要的format

    (文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) #这段话可以由下面的话替代56     respond_to do |format|57       ...