java Semaphore信号亮-同意多个任务同一时候訪问这个资源--thinking in java21.7.6

package org.rui.thread.newc.semaphore;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Semaphore;
/**
 * 同意N个任务同一时候訪问这个资源
 * @author lenovo
 *
 * @param <T>
 */
public class Pool<T>
{
	private int size;
	private List<T> items = new ArrayList<T>();

	private volatile boolean[] checkedOut;

	private Semaphore available;

	public Pool(Class<T> classObject, int size)
	{
		this.size = size;
		checkedOut = new boolean[size];
		available = new Semaphore(size, true);
		// load pool with objects that can be checked out:能够检查的对象的负载池
		for (int i = 0; i < size; i++)
		{
			// assumes a default constructor自己的默认构造函数
			try
			{
//				Object o=classObject.newInstance();
//				Fat f=(Fat) classObject.newInstance();
				items.add(classObject.newInstance());
			} catch (Exception e)
			{
				throw new RuntimeException(e);
			}
		}
	}

	//假设你须要一个新对象,那么你能够调用checkOut(),在使用完后递交给checkIn()
	public T checkOut() throws InterruptedException
	{
		//假设没有不论什么的Semaphore许何证,意味着池中没有对象可用了
		available.acquire();//获取一个许可(假设提供了一个)并马上返回,将可用的许可数减 1。
		return getItems();
	}

	public void checkIn(T x)
	{
		if (releaseItem(x))
			//假设被签入的对象有效,则会向信号亮返回一个许可证
			available.release();//释放一个许可,将其返回给信号量。

	}

	private synchronized T getItems()
	{
		for (int i = 0; i < size; ++i)
		{
			//System.out.println(checkedOut[i]);
			if (!checkedOut[i])//假设为false  说明是releaseItem 则能够签出
			{
				checkedOut[i] = true;
				//System.out.println("xxxxxx===="+items.get(i));
				return items.get(i);
			}

		}
		return null;// semaphore prevents reaching here防止信号到达这里
	}

	private synchronized boolean releaseItem(T item)
	{
		int index = items.indexOf(item);
		if (index == -1)
			return false;// not in the list
		if (checkedOut[index])//假设为true 则说明已签出 则能够释放
		{
			//System.out.println("releaseItem:"+item);
			checkedOut[index] = false;
			return true;
		}
		return false;// wasn‘t checked out 没有签出
	}
}

package org.rui.thread.newc.semaphore;

public class Fat
{
	private volatile double d;
	private static int counter = 0;
	private final int id = counter++;

	public Fat()
	{
		// expensive, interruptible operation:
		for (int i = 1; i < 10000; i++)
		{
			d += (Math.PI + Math.E) / (double) i;
		}
	}

	public void operation()
	{
		System.out.println("operation>>  "+this);
	}

	@Override
	public String toString()
	{
		return "Fat>>id:" + id;
	}
}

<pre name="code" class="java">package org.rui.thread.newc.semaphore;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

class CheckoutTask<T> implements Runnable
{

	private static int counter = 0;
	private final int id = counter++;
	private int index;

	private Pool<T> pool;

	public CheckoutTask(Pool<T> pool, int size)
	{
		this.pool = pool;
		this.index = size;
	}

	@Override
	public void run()
	{

		try
		{
			T item = pool.checkOut();
			System.out.println(this + "checked out 已签出:" + item);
			TimeUnit.SECONDS.sleep(1);
			System.out.println("checked in 释放:" + item);
			pool.checkIn(item);// 将用完的对像释放
			// System.out.println(index+"  counter="+counter+"  id=="+id);
			// if(index==counter-1){
			// TimeUnit.SECONDS.sleep(1);
			// System.out.println("=======all checkoutTasks created");
			//
			// }

		} catch (InterruptedException e)
		{
			System.out.println(e.getMessage());
			// TODO Auto-generated catch block
			// e.printStackTrace();
		}

	}

	@Override
	public String toString()
	{
		return "checkoutTask " + id + " ";
	}

}

// //////////////////////////
public class SemaphoreDemo
{
	final static int Size = 25;

	public static void main(String[] args) throws InterruptedException
	{
		final Pool<Fat> pool = new Pool<Fat>(Fat.class, Size);

		ExecutorService exec = Executors.newCachedThreadPool();
		// 開始操练pool
		for (int i = 0; i < Size; i++)
		{
			exec.execute(new CheckoutTask<Fat>(pool, i));
		}
		System.out.println("all checkoutTasks created");

		// main 開始签出pool中的Fat对象 -1,但并不签入他们。

// 一但池中的全部的对象都被签出后,semaphore将不在运行不论什么签出操作,
		List<Fat> list = new ArrayList<Fat>();
		for (int i = 0; i < Size; i++)
		{
			try
			{
				Fat f = pool.checkOut();
				System.out.println(i + "   >>main() thrad checked out 签出");

				f.operation();
				list.add(f);
			} catch (InterruptedException e)
			{
				e.printStackTrace();
			}
		}

		// 无对象可签出 run 会堵塞
		Future<?

> blocked = exec.submit(new Runnable()
		{

			@Override
			public void run()
			{
				try
				{
					// semaphore prevents additional checkout 信号量防止额外的校验
					// so call is blocked 因此调用被堵塞
					pool.checkOut();
				} catch (InterruptedException e)
				{
					System.err.print("checkOut() interrupted");
					// e.printStackTrace();
				}

			}

		});
		// 持有一段时间后再将它们签入
		TimeUnit.SECONDS.sleep(2);
		// 以此来挣脱future。取消,冗余的签入将被pool忽略
		System.out.println("任务是否完毕:"+blocked.isDone());
		blocked.cancel(true);// break out of blocked call 中断呼叫中断 试图取消对此任务的运行
		System.out.println();

		/////////////////都签入之后 再能够继续使用pool
		for (Fat f : list)
		{
			pool.checkIn(f);
		}
		//这里事实上能够再次使用pool了,
		for (Fat f : list)
		{
			pool.checkIn(f);// second checkin ignored 二签忽略
		}
		// exec.shutdown();
	}

}

/**
 * output:
 * checkoutTask 0 checked out 已签出:Fat>>id:0
checkoutTask 2 checked out 已签出:Fat>>id:2
checkoutTask 1 checked out 已签出:Fat>>id:1
checkoutTask 4 checked out 已签出:Fat>>id:3
checkoutTask 3 checked out 已签出:Fat>>id:4
checkoutTask 5 checked out 已签出:Fat>>id:5
checkoutTask 6 checked out 已签出:Fat>>id:6
checkoutTask 7 checked out 已签出:Fat>>id:7
checkoutTask 8 checked out 已签出:Fat>>id:8
checkoutTask 9 checked out 已签出:Fat>>id:9
checkoutTask 10 checked out 已签出:Fat>>id:10
checkoutTask 11 checked out 已签出:Fat>>id:11
checkoutTask 12 checked out 已签出:Fat>>id:12
checkoutTask 13 checked out 已签出:Fat>>id:13
checkoutTask 14 checked out 已签出:Fat>>id:14
checkoutTask 15 checked out 已签出:Fat>>id:15
checkoutTask 16 checked out 已签出:Fat>>id:16
checkoutTask 18 checked out 已签出:Fat>>id:18
checkoutTask 17 checked out 已签出:Fat>>id:17
checkoutTask 19 checked out 已签出:Fat>>id:19
checkoutTask 20 checked out 已签出:Fat>>id:20
checkoutTask 21 checked out 已签出:Fat>>id:21
checkoutTask 22 checked out 已签出:Fat>>id:22
checkoutTask 23 checked out 已签出:Fat>>id:23
all checkoutTasks created
0   >>main() thrad checked out 签出
operation>>  Fat>>id:24
checked in 释放:Fat>>id:1
checkoutTask 24 checked out 已签出:Fat>>id:1
checked in 释放:Fat>>id:2
1   >>main() thrad checked out 签出
operation>>  Fat>>id:2
checked in 释放:Fat>>id:0
2   >>main() thrad checked out 签出
operation>>  Fat>>id:0
checked in 释放:Fat>>id:3
3   >>main() thrad checked out 签出
operation>>  Fat>>id:3
checked in 释放:Fat>>id:4
4   >>main() thrad checked out 签出
operation>>  Fat>>id:4
checked in 释放:Fat>>id:5
5   >>main() thrad checked out 签出
operation>>  Fat>>id:5
checked in 释放:Fat>>id:7
6   >>main() thrad checked out 签出
operation>>  Fat>>id:7
checked in 释放:Fat>>id:9
7   >>main() thrad checked out 签出
operation>>  Fat>>id:9
checked in 释放:Fat>>id:11
8   >>main() thrad checked out 签出
operation>>  Fat>>id:11
checked in 释放:Fat>>id:13
9   >>main() thrad checked out 签出
operation>>  Fat>>id:13
checked in 释放:Fat>>id:15
10   >>main() thrad checked out 签出
operation>>  Fat>>id:15
checked in 释放:Fat>>id:17
11   >>main() thrad checked out 签出
operation>>  Fat>>id:17
checked in 释放:Fat>>id:21
12   >>main() thrad checked out 签出
operation>>  Fat>>id:21
checked in 释放:Fat>>id:19
13   >>main() thrad checked out 签出
operation>>  Fat>>id:19
checked in 释放:Fat>>id:23
14   >>main() thrad checked out 签出
operation>>  Fat>>id:23
checked in 释放:Fat>>id:8
checked in 释放:Fat>>id:6
15   >>main() thrad checked out 签出
operation>>  Fat>>id:6
16   >>main() thrad checked out 签出
operation>>  Fat>>id:8
checked in 释放:Fat>>id:10
17   >>main() thrad checked out 签出
checked in 释放:Fat>>id:14
checked in 释放:Fat>>id:16
checked in 释放:Fat>>id:18
checked in 释放:Fat>>id:20
checked in 释放:Fat>>id:22
checked in 释放:Fat>>id:12
operation>>  Fat>>id:10
18   >>main() thrad checked out 签出
operation>>  Fat>>id:12
19   >>main() thrad checked out 签出
operation>>  Fat>>id:14
20   >>main() thrad checked out 签出
operation>>  Fat>>id:16
21   >>main() thrad checked out 签出
operation>>  Fat>>id:18
22   >>main() thrad checked out 签出
operation>>  Fat>>id:20
23   >>main() thrad checked out 签出
operation>>  Fat>>id:22
checked in 释放:Fat>>id:1
24   >>main() thrad checked out 签出
operation>>  Fat>>id:1
任务是否完毕:false

checkOut() interrupted
*/

时间: 2024-11-06 22:49:12

java Semaphore信号亮-同意多个任务同一时候訪问这个资源--thinking in java21.7.6的相关文章

java Semaphore信号亮-允许多个任务同时访问这个资源--thinking in java21.7.6

package org.rui.thread.newc.semaphore; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Semaphore; /** * 允许N个任务同时访问这个资源 * @author lenovo * * @param <T> */ public class Pool<T> { private int size; private List<T

java中訪问修饰符

较之c++ 中 public,proctected, private 三种訪问控制, java多了默认訪问控制. java中四种訪问控制权限 简单描写叙述为一下四句: 1)private 仅本类可见 (同c++) 2)默认 对本包可见/包内訪问 (c++没有) 3)protected 对本包和全部子类可见 (c++中没有本包概念.较 默认訪问 能够被在其它包下的子类訪问) 4)public 对全部类可见 (同c++) 当中1)4)与c++同样,对2)3)做简单測试 3)protected 对本包

Java 訪问权限控制:你真的了解 protected keyword吗?

摘要: 在一个类的内部,其成员(包含成员变量和成员方法)是否能被其它类所訪问,取决于该成员的修饰词:而一个类是否能被其它类所訪问,取决于该类的修饰词.Java的类成员訪问权限修饰词有四类:private,无(默认情况下.包訪问权限),protected 和 public,而当中仅仅有包訪问权限和public才干修饰一个类(内部类除外).特别地,非常多的介绍Java的书籍对protected介绍的比較笼统,经常会对大家造成误解. 因此,本文重点揭示了 protected 关键字的内涵和使用方法,并

Java设计模式(三) Visitor(訪问者)模式及多分派场景应用

基本概念 Visitor 封装一些作用于数据结构中的各元素的操作,不同的操作能够借助新的visitor实现.减少了操作间的耦合性 訪问者能够将数据结构和对数据的操作解耦,使得添加对数据结构的操作不须要取改动数据结构,也不必去改动原有的操作,而运行时再定义新的Visitor时闲着即可了(在操作加入上易拓展) 模式中角色分工 Visitor:抽象訪问者,在重载的visit函数中声明訪问者能够訪问的对象. Concrete Visitor:实现一个訪问者对于一个详细的元素的操作 Element:抽象元

JAVA訪问URL

JAVA訪问URL: package Test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URI; import java.net.URISyntaxException; import java.

JAVA基础之訪问控制权限(封装)

包:库单元 1.当编写一个Java源码文件时.此文件通常被称为编译单元(有时也被称为转译单元). 2.每一个编译单元都必须有一个后缀名.java,而在编译单元内则能够有一个public类,该类名称必须和文件的名称同样. 3.每一个编译单元仅仅能有一个public类,否则编译器就不会接受. 4.假设在该编译单元之中还有额外的类的话,那么在包之外的世界是无法看见这些类的,由于它们不是public类. 代码组织 xx.java编译生成xx.class package语句必须是文件除凝视以外的第一句程序

Cassandra数据库Java訪问

针对的时Cassandra 2.0 数据库 Java本地client訪问Cassandra,首先建立Javaproject,使用Maven进行管理. 引入依赖: <dependency> <groupId>com.datastax.cassandra</groupId> <artifactId>cassandra-driver-core</artifactId> <version>2.1.0</version> </

Android中关于JNI 的学习(三)在JNI层訪问Java端对象

前面两篇文章简介了JNI层跟Java层的一些相应关系,包含方法名,数据类型和方法名称等,相信在理论层面.可以非常好地帮助我们去了解JNI在Native本地开发中的作用,对JNI的一些概念也有了一个初步的认识,因为表达能力或者理解还是有限,有些地方讲得不是非常清楚.假设各位朋友有认为云里雾里,欢迎大家留言一起学习. 概念上的理解有助于我们更好地认识JNI.而一些实际点的样例则可以更好地帮我们从代码上去掌握并应用JNI. 在第一篇文章,我们是从一个小样例来入门学习的,在当中,我们通过JNI层函数返回

Java中使用多线程、curl及代理IP模拟post提交和get訪问

Java中使用多线程.curl及代理IP模拟post提交和get訪问 菜鸟,多线程好玩就写着玩.大神能够路过不吝赐教.小弟在这受教.谢谢! 很多其它分享请关注微信公众号:lvxing1788 ~~~~~~ 切割线扭起来 ~~~~~~ /** * @组件名:javaDemo * @包名:javaDemo * @文件名称:Jenny.java * @创建时间: 2014年8月1日 下午5:53:48 * @版权信息:Copyright ? 2014 eelly Co.Ltd,小姨子版权全部. */