最近在学习java,看到wiat/notify机制实现线程通信,由于平时工作用的C#,赶紧用C#方式实现一个demo。

Java 代码:

import java.util.ArrayList;
import java.util.List; public class MyList { private static List list = new ArrayList(); public static void add() {
list.add("anyString");
} public static int size() {
return list.size();
} } import extlist.MyList; public class ThreadA extends Thread { private Object lock; public ThreadA(Object lock) {
super();
this.lock = lock;
} @Override
public void run() {
try {
synchronized (lock) {
if (MyList.size() != ) {
System.out.println("wait begin "
+ System.currentTimeMillis());
lock.wait();
System.out.println("wait end "
+ System.currentTimeMillis());
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
} } import extlist.MyList; public class ThreadB extends Thread {
private Object lock; public ThreadB(Object lock) {
super();
this.lock = lock;
} @Override
public void run() {
try {
synchronized (lock) {
for (int i = ; i < ; i++) {
MyList.add();
if (MyList.size() == ) {
lock.notify();
System.out.println("已发出通知!");
}
System.out.println("添加了" + (i + ) + "个元素!");
Thread.sleep();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
} } import extthread.ThreadA;
import extthread.ThreadB; public class Run { public static void main(String[] args) { try {
Object lock = new Object(); ThreadA a = new ThreadA(lock);
a.start(); Thread.sleep(); ThreadB b = new ThreadB(lock);
b.start();
} catch (InterruptedException e) {
e.printStackTrace();
} } }

C# 代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading; namespace ConsoleApplication1
{
internal class Program
{
private static void Main(string[] args)
{
var obj = new object();
var thread1 = new Thread(Test1);
thread1.Start(obj); Thread.Sleep(); var thread2 = new Thread(Test2);
thread2.Start(obj);
} public static void Test1(object obj)
{
try
{
Monitor.Enter(obj);
if (MyList.Size() != )
{
Console.WriteLine("wait begin" + DateTime.Now);
Monitor.Wait(obj);
Console.WriteLine("wait end" + DateTime.Now);
}
Monitor.Exit(obj);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
} public static void Test2(object obj)
{
try
{
Monitor.Enter(obj);
for (int i = ; i < ; i++)
{
MyList.Add();
if (MyList.Size() == )
{
Monitor.Pulse(obj);
Console.WriteLine("已发出通知!" + DateTime.Now);
}
Console.WriteLine("添加了(" + (i + ) + ")个元素");
Thread.Sleep();
}
Monitor.Exit(obj);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
} public class MyList
{
private static readonly List<string> list = new List<string>(); public static void Add()
{
list.Add("anyString");
} public static int Size()
{
return list.Count();
}
}
}

最新文章

  1. pyside 移动窗口到屏幕中间
  2. $inArray()总是返回-1
  3. java 输入输出流1 FileInputStrem&amp;&amp;FileOutStream
  4. Linux Bluetooth内核分析
  5. HDOJ 1042 N! -- 大数运算
  6. MSSQL 常用内置函数
  7. HDU1394(线段树||树状数组)
  8. sql 两种分页offset和row_number简单分析
  9. git错误--ssh: Could not resolve hostname ssh.github.com: Name or service not known--解决方式
  10. Axure文本框验证和外部url的调用
  11. react 字符串强转为html标签
  12. go语言求1到100之内的质数
  13. MVC3学习:将excel文件导入到sql server数据库
  14. uc浏览器app点评
  15. 解决chrome,下载在文件夹中显示,调用错误的关联程序
  16. YQCB冲刺周第一天
  17. 在Nginx服务器上屏蔽IP
  18. [Android Tips] 17. 查看 APK 签名信息
  19. DPDK内存管理-----rte_mbuf(转)
  20. Android 单击图片切换效果

热门文章

  1. 编写shell时,遇到let: not found错误及解决办法
  2. sublime py不能输入中文
  3. spring学习 8-面试(事务,解决线程安全)
  4. C# SqlCommand和SqlDataAdapter的区别
  5. Android手机Fiddler真机抓包
  6. asp.net下使用Cookie保存登录信息
  7. 通过父类定位到子类 先将父类当作一个dom
  8. BZOJ 2004 公交线路(状压DP+矩阵快速幂)
  9. 使用android资源
  10. 【BZOJ2141】排队(树套树)