日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

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

發(fā)布時間:2023/12/10 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 autoresetevent java_[原创]AutoResetEvent, ManualResetEvent的Java模拟 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

AutoResetEvent, ManualResetEvent是C#中常用的線程同步方法,在Java中可以模擬,AutoResetEvent使用Semaphore,增加的是許可證數(shù)量,程序里只有一個許可證,那么當(dāng)這個許可被使用后,就會自動鎖定。相反,ManualResetEvent使用countdownlatch,增加的是“l(fā)atch”,也就是障礙,或者門閂;當(dāng)障礙解除時,所有程序都可以運(yùn)行而不被阻塞,如果要實(shí)現(xiàn)同步,就必須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實(shí)現(xiàn)

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

分享到:

2011-04-07 16:39

瀏覽 2539

評論

總結(jié)

以上是生活随笔為你收集整理的autoresetevent java_[原创]AutoResetEvent, ManualResetEvent的Java模拟的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。