最近在学习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();
}
}
}

C# 实现java中 wiat/notify机制的更多相关文章

  1. java中wait/notify机制

    通常,多线程之间需要协调工作.例如,浏览器的一个显示图片的线程displayThread想要执行显示图片的任务,必须等待下载线程 downloadThread将该图片下载完毕.如果图片还没有下载完,d ...

  2. java中的反射机制在Android开发中的用处

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...

  3. 浅说Java中的反射机制(二)

    写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...

  4. 浅说Java中的反射机制(一)

    在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...

  5. 【Java】深入理解Java中的spi机制

    深入理解Java中的spi机制 SPI全名为Service Provider Interface是JDK内置的一种服务提供发现机制,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用 ...

  6. 【Java基础】java中的反射机制与动态代理

    一.java中的反射机制 java反射的官方定义:在运行状态下,可以获取任意一个类的所有属性和方法,并且可通过某类任意一对象实例调用该类的所有方法.这种动态获取类的信息及动态调用类中方法的功能称为ja ...

  7. 【夯实基础】- Java中的fail-fast机制

    转载自:Java中的fail-fast机制 遍历删除List中的元素有很多种方法,当运用不当的时候就会产生问题.下面主要看看以下几种遍历删除List中元素的形式: 1.通过普通的for删除删除符合条件 ...

  8. java 中利用反射机制获取和设置实体类的属性值

    摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...

  9. 结合实战和源码来聊聊Java中的SPI机制?

    写在前面 SPI机制能够非常方便的为某个接口动态指定其实现类,在某种程度上,这也是某些框架具有高度可扩展性的基础.今天,我们就从源码级别深入探讨下Java中的SPI机制. 注:文章已收录到:https ...

随机推荐

  1. C语言的问卷调查

    1.你对自己的未来有什么规划?做了哪些准备? 未来想当一个网络工程师,为了这个目标我正在努力学习网络.网页及相关的知识. 2.你认为什么是学习?学习有什么用?现在学习动力如何?为什么? 学习就是不断尝 ...

  2. texbbox,combobox设置属性

    --输入框 $("#xx").textbox('setValue','value');  //设置输入框的值 $('#xx').textbox('textbox').attr('r ...

  3. emacs编译整个emacs.d目录

    $emacs 在emacs查看里面,输入: C-u M-x byte-recompile-directory 然后输入 ~/.emacs.d 即可.

  4. "数学口袋精灵"bug

    首先要部署这个app项目就是第一步: 一.前提下载并安装JDK 在线图解:手把手教你安装JDK      http://www.lvtao.net/server/windows-setup-jdk.h ...

  5. QUdpSocket-Qt使用Udp通讯实现服务端和客户端

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QUdpSocket-Qt使用Udp通讯实现服务端和客户端     本文地址:https:// ...

  6. 【vue】this与that 一个坑

    [转载自]:https://blog.csdn.net/qq_30378229/article/details/78429374 在Vue中this始终指向Vue,但axios中this为undefi ...

  7. webgl example1

    <!doctype html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  8. PHP面向对象之接口

    接口(interface)技术 什么是接口? 先看抽象类: abstract  class  类名  { 属性1: 属性2: ..... 非抽象方法1: 非抽象方法2: ...... 抽象方法1: 抽 ...

  9. 数据库引擎InnoDB和MyISAM区别

    MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然性能极佳,但却有一个缺点 ...

  10. java finally 与return

    finally之外的语句块有return,finally语句块没有return:该语句块的返回值被固定下来,等fianlly执行完后返回给调用者 finally语句块与其他语句块同时有return:返 ...