C# 实现java中 wiat/notify机制
2016-05-18 10:22
609 查看
最近在学习java,看到wiat/notify机制实现线程通信,由于平时工作用的C#,赶紧用C#方式实现一个demo。
Java 代码:
C# 代码:
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() != 5) { 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 = 0; i < 10; i++) { MyList.add(); if (MyList.size() == 5) { lock.notify(); System.out.println("已发出通知!"); } System.out.println("添加了" + (i + 1) + "个元素!"); Thread.sleep(1000); } } } 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(50); 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(50); var thread2 = new Thread(Test2); thread2.Start(obj); } public static void Test1(object obj) { try { Monitor.Enter(obj); if (MyList.Size() != 5) { 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 = 0; i < 10; i++) { MyList.Add(); if (MyList.Size() == 5) { Monitor.Pulse(obj); Console.WriteLine("已发出通知!" + DateTime.Now); } Console.WriteLine("添加了(" + (i + 1) + ")个元素"); Thread.Sleep(1000); } 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(); } } }
相关文章推荐
- 为什么Java中字符串是不可变的
- MyEclipse如何对Hibernate进行逆向工程
- 代码获取spring管理的javabean
- 安装winPcap和jpcap
- java实现在线预览--poi实现word、excel、ppt转html
- Unresolved inclusion: <jni.h>
- java枚举常用场景小结
- Spring MVC学习笔记——Welcome
- 如何在Java程序中访问mysql数据库中的数据并进行简单的操作
- Java并发编程学习路线图
- Java NIO使用及原理分析 (四)
- WebService加入WS-Security的应用
- java基础--关于map的遍历keySet和entrySet
- JAVA的环境变量配置及详解
- Spring整合Hibernate 声明式的事务管理
- java的遍历数组效率测试源码
- JSP和JavaBean测试
- Java--面包师与消费者2(发送线程与接收线程)
- 如何让Eclipse高亮选中的变量
- MyEclipse连接Mysql数据库的方法(一)