autoresetevent java_[原创]AutoResetEvent, ManualResetEvent的Java模拟

AutoResetEvent, ManualResetEvent是C#中常用的线程同步方法,在Java中可以模拟,AutoResetEvent使用Semaphore,增加的是许可证数量,程序里只有一个许可证,那么当这个许可被使用后,就会自动锁定。相反,ManualResetEvent使用countdownlatch,增加的是“latch”,也就是障碍,或者门闩;当障碍解除时,所有程序都可以运行而不被阻塞,如果要实现同步,就必须manual reset,也就是手动加latch。

import java.util.concurrent.Semaphore;

import java.util.concurrent.TimeUnit;

public class AutoResetEvent

{

private final Semaphore event;

private final Integer mutex;

public AutoResetEvent(boolean signalled)

{

event = new Semaphore(signalled ? 1 : 0);

mutex = new Integer(-1);

}

public void set()

{

synchronized (mutex)

{

if (event.availablePermits() == 0)

{

event.release();

}

}

}

public void reset()

{

event.drainPermits();

}

public void waitOne() throws InterruptedException

{

event.acquire();

}

public boolean waitOne(int timeout, TimeUnit unit) throws InterruptedException

{

return event.tryAcquire(timeout, unit);

}

public boolean isSignalled()

{

return event.availablePermits() > 0;

}

public boolean waitOne(int timeout) throws InterruptedException

{

return waitOne(timeout, TimeUnit.MILLISECONDS);

}

}

AutoResetEvent在MSDN中的例子程序在http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx

我们可以改写一个java版本,用的是java版本的AutoResetEvent

import java.util.Date;

import java.util.Random;

class TermInfo

{

public long[] terms;

public int order;

public long baseValue;

public AutoResetEvent trigger;

}

public class AutoResetEventTest

{

private final static int numTerms = 3;

public static void main(String[] args0) throws InterruptedException

{

AutoResetEvent trigger = new AutoResetEvent(false);

TermInfo tinfo = new TermInfo();

Thread termThread;

long[] terms = new long[numTerms];

int result = 0;

tinfo.terms = terms;

tinfo.trigger = trigger;

for (int i = 0; i < numTerms; i++)

{

tinfo.order = i;

// Create and start the term calc thread.

TermThreadProc termThreadProc = new TermThreadProc(tinfo);

termThread = new Thread(termThreadProc);

termThread.start();

// simulate a number crunching delay

Thread.sleep(1000);

Date date = new Date();

tinfo.baseValue = Integer.parseInt(String.valueOf((date.getTime())).substring(10));

trigger.set();

termThread.join();

result += terms[i];

}

System.out.format("Result = %d", result);

System.out.println();

}

}

class TermThreadProc implements Runnable

{

public TermInfo termInfo;

public TermThreadProc(TermInfo termInfo)

{

this.termInfo = termInfo;

}

@Override

public void run()

{

TermInfo tinfo = termInfo;

System.out.format("Term[%d] is starting...", tinfo.order);

System.out.println();

// set the precalculation

Date date = new Date();

long preValue = Integer.parseInt(String.valueOf((date.getTime())).substring(10)) + tinfo.order;

// wait for base value to be ready

try

{

tinfo.trigger.waitOne();

}

catch (InterruptedException e)

{

e.printStackTrace();

}

Random rnd = new Random(tinfo.baseValue);

tinfo.terms[tinfo.order] = preValue * rnd.nextInt(10000);

System.out.format("Term[%d] has finished with a value of: %d", tinfo.order, tinfo.terms[tinfo.order]);

System.out.println();

}

}

//ManualResetEvent 的Java实现

import java.util.concurrent.CountDownLatch;

import java.util.concurrent.TimeUnit;

public class ManualResetEvent

{

private volatile CountDownLatch event;

private final Integer mutex;

public ManualResetEvent(boolean signalled)

{

mutex = new Integer(-1);

if (signalled)

{

event = new CountDownLatch(0);

}

else

{

event = new CountDownLatch(1);

}

}

public void set()

{

event.countDown();

}

public void reset()

{

synchronized (mutex)

{

if (event.getCount() == 0)

{

event = new CountDownLatch(1);

}

}

}

public void waitOne() throws InterruptedException

{

event.await();

}

public boolean waitOne(int timeout, TimeUnit unit) throws InterruptedException

{

return event.await(timeout, unit);

}

public boolean isSignalled()

{

return event.getCount() == 0;

}

public boolean waitOne(int timeout) throws InterruptedException

{

return waitOne(timeout, TimeUnit.MILLISECONDS);

}

}

MSDN地址:http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent.aspx

Java测试:

import java.util.Scanner;

import java.io.IOException;

public class ManualResetEventTest

{

// mre is used to block and release threads manually. It is

// created in the unsignaled state.

static AutoResetEvent mre = new AutoResetEvent(false);

public static void main(String[] arg0) throws IOException, InterruptedException

{

System.out.println("\nStart 3 named threads that block on a ManualResetEvent:\n");

Scanner keyIn = new Scanner(System.in);

System.out.print("Press the enter key to continue");

keyIn.nextLine();

for (int i = 0; i <= 2; i++)

{

threadProc threadProc = new threadProc();

Thread t = new Thread(threadProc);

t.setName("Thread_" + i);

t.start();

}

Thread.sleep(500);

System.out.println("\nWhen all three threads have started, press Enter to call Set()"

+ "\nto release all the threads.\n");

keyIn.nextLine();

mre.set();

Thread.sleep(500);

System.out.println("\nWhen a ManualResetEvent is signaled, threads that call WaitOne()"

+ "\ndo not block. Press Enter to show this.\n");

keyIn.nextLine();

for (int i = 3; i <= 4; i++)

{

threadProc threadProc = new threadProc();

Thread t = new Thread(threadProc);

t.setName("Thread_" + i);

t.start();

}

Thread.sleep(500);

System.out.println("\nPress Enter to call Reset(), so that threads once again block"

+ "\nwhen they call WaitOne().\n");

keyIn.nextLine();

mre.reset();

// Start a thread that waits on the ManualResetEvent.

threadProc threadProc = new threadProc();

Thread t5 = new Thread(threadProc);

t5.setName("Thread_5");

t5.start();

Thread.sleep(500);

System.out.println("\nPress Enter to call Set() and conclude the demo.");

keyIn.nextLine();

mre.set();

}

}

class threadProc implements Runnable

{

@Override

public void run()

{

String name = Thread.currentThread().getName();

System.out.println(name + " starts and calls mre.WaitOne()");

try

{

ManualResetEventTest.mre.waitOne();

}

catch (InterruptedException e)

{

e.printStackTrace();

}

System.out.println(name + " ends.");

}

}

0

0

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2011-04-07 16:39

浏览 2539

评论

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用Jfree实现条形柱状图表,java代码实现

用Jfree实现条形柱状图表&#xff0c;java代码实现。可经经常使用于报表的制作&#xff0c;代码自己主动生成后能够自由查看。能够自由配置图表的各个属性&#xff0c;用来达到自己的要求和目的package test1;import org.jfree.chart.*; import org.jfree.chart.plot.*; import…

bzoj 2160: 拉拉队排练

Description 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了。拉拉队是篮球比赛的一个看点&#xff0c;好的拉拉队往往能帮助球队增加士气&#xff0c;赢得最终的比赛。所以作为拉拉队队长的楚雨荨同学知道&#xff0c;帮助篮球队训练好拉拉队有多么的重要。拉拉队的选拔工…

java long double精度丢失_long long类型转double类型部分精度丢失问题

我最近做了一道题&#xff0c;一个64位(unsigned __int64)范围内的数输出其除以1000的值&#xff0c;并按四舍五入保留小数点后三位。我刚开始直接写WA&#xff0c;结果发现当数比较大的时候&#xff0c;结果后几位精度总会丢失&#xff0c;只好手动模拟了一个&#xff0c;水过…

从服务器上自动更新系统补丁

对于经常重系统的用户或公司,每次安装系统后,必须得从微软网站上面下载补丁,这样很浪费时间. 如何从自己服务器上自动更新系统补丁,方法如下: 服务器端 服务器端需要安装一个更新服务器软件,如:SUS (下载地址http://www.onlinedown.net/soft/35844.htm) 客户端设置 开始 -- 运行…

搭建于 Cubieboard 之上的超小型实时监控平台 - mjpg篇

2019独角兽企业重金招聘Python工程师标准>>> 运行于 Cubieboard开发板 之上的个人笔记博客 http://cb.e-fly.org:81/archives/system-camera-monitor-mjpg-streamer.html 原文作者&#xff1a;Cannikin原文链接&#xff1a;http://forum.cubietech.com/forum ... p…

架构-浅谈MySQL数据库优化

主从复制博文&#xff1a;http://lizhenliang.blog.51cto.com/7876557/1290431 读写分离博文&#xff1a;http://lizhenliang.blog.51cto.com/7876557/1305083 MySQL-MMM博文&#xff1a;http://lizhenliang.blog.51cto.com/7876557/1354576 &#xff08;一&#xff09;数据库部…

java base64解码出错_Java Base64解码错误及解决方法

问题提出&#xff1a;自己在做一个小网站充当练手&#xff0c;但是前端图片经过base64加密后传往后端在解码。但是一直都有问题&#xff0c;请大神赐教public static string base64toimg(string src) throws ioexception {string uuid uuid.randomuuid().tostring();stringbui…

PPT图片内嵌文字效果

【摘要】在报纸杂志上我们经常看到&#xff0c;有些图片中可以嵌入文字&#xff0c;如下图所示的效果&#xff1a;今天我们一起来学习一下这种效果是怎样生成的。 【正文】以下的操作步骤为PowerPoint 2013版本。 一 插入图片并编辑图片在【插入-联机图片】中搜索需要的图片。…

[天地君亲若追问 枉为知音百年羞]2008.06.07 晃荡在芳华

洞房悄悄静悠悠&#xff0c;花烛高烧暖心头&#xff0c; 喜气阵阵难抑止&#xff0c;这姻缘百折千磨方成啊就。 三月来&#xff0c;屡托刘兄把亲求&#xff0c;每遭见拒愿难酬&#xff0c; 从此我诗书五经无心看&#xff0c;三餐茶饭懒下喉&#xff0c; 日卧书斋愁脉脉&#xf…

基于mykernel完成多进程的简单内核

学号351 原创作品转载请注明出处 https://github.com/mengning/linuxkernel/ mykernel简介 mykernel是由孟宁老师建立的一个用于开发您自己的操作系统内核的平台&#xff0c;基于Linux Kernel 3.9.4 source code mykernel的源代码 https://github.com/mengning/mykernel &…

iOS开发:通过经纬度获得城市、省份等信息

iOS系统自带定位&#xff0c;用CLLocationManager就可以轻松的实现定位的操作&#xff0c;获得的是一组经纬度&#xff0c;当然&#xff0c;也可以根据给出的经纬度获取相应的省份、城市、街道等信息&#xff0c;下面就看一个根据经纬度获得城市的demo&#xff1a;因为获取经纬…

.net内存回收与Dispose﹐Close﹐Finalize方法

一. net的对象使用一般分为三种情况﹕ 1.创建对象 2.使用对象 3.释放对象 二.创建对象 1.创建对象实际分为两个步骤﹕变量类型宣告和初始化对象 2.变量类型宣告(declare),如﹕ FileStream fs这行代码会在当前的变量作用域空间(栈或堆)里建立一个叫做fs的变量﹐至少四个字节吧(因…

19、Qt线程(四):继承QRunnable类

一、功能说明 1、通过继承QRunnable&#xff0c;重写run的方式实现多线程 2、点击“开始”按钮启动子线程&#xff1b; 二、项目创建 1、新建Qt Widgets Application应用&#xff0c;名称为Runnable&#xff0c;基类选择QMainWindow&#xff1b; 2、MainWindow.ui中放入一…

cocos2dx java 调用lua_cocos2dx之C++调用Lua

1&#xff0e;引入头文件#include "cocos2d.h"#include "CCLuaEngine.h"USING_NS_CC;using namespace std;extern "C"{#include "lua.h"#include "lualib.h"#include "lauxlib.h"}2导入Lua文件如果是cocos2dx的Lu…

93号涨0.86元售6.2元/升 20日油价正式上调

93号涨0.86元售6.2元/升 20日油价正式上调 据悉&#xff0c;自6月20日起汽油、柴油价格每吨提高1000元&#xff0c;航空煤油价格每吨提高1500元。 上调后全国汽油、柴油平均零售价分别为&#xff1a;97号汽油6.6元/升&#xff0c;93号汽油6.2元/升&#xff0c;90号汽油5.8元/升…

eclipse 新建java无scr_解决eclipse中没有js代码提示的问题

自学js&#xff0c;发现eclipse中不管js文件、html文件、jsp文件没有都没js代码的提示&#xff0c;对于js代码也不报错&#xff0c;有时候就因为单词敲错却查了很久没查出来&#xff0c;很烦很难受。在网上找了很多方法&#xff0c;都没有解决&#xff0c;特别是有个在javascri…

美女MVP专访

博客园专访:中国最美丽的MVP请大家在专访页面中发表评论。制作花絮&#xff1a;在测试专访页面时&#xff0c;不小心发布到了新闻频道&#xff0c;立即引来了园友的热情评论。 推荐小组&#xff1a;转载于:https://www.cnblogs.com/cmt/archive/2008/07/14/1241994.html

Flask + vue 前后端分离的 二手书App

一个Flask vue 前后端分离的 二手书App 效果展示&#xff1a; https://blog.csdn.net/qq_42239520/article/details/88534955 所用技术清单 项目地址&#xff1a;项目地址 vue代码地址&#xff1a;vue代码地址 项目部分过程笔记&#xff1a; 后台&#xff1a; 项目结构 Second…

Mac OS X Glut build instructions

Mac OS X Glut build instructions(在Mac上用glut库编写OpenGL程序) Wentao Sun, Autodesk, Inc. 1. Building GLUT apps under Mac OS X There are only a few modifications you need to make to the robot.c sample to get it compiled on your Mac. These instruction…

跨域方法

1.jsonp,原理利用script的src属性(像img,iframe等有src属性的都支持跨域)引入js文件&#xff0c;并在引入成功后调用回调函数&#xff0c;数据通过参数的形式传过来。 例&#xff1a; 2.window.name 3.document.domain 4.h5的方法&#xff1a;window.postMessage 5.flash 6.COR…