一个方法最多2个线程同时使用的JAVA实现
2008-10-31 11:41
1096 查看
原文:http://www.java2000.net/p11416
题目来自论坛,有兴趣的可以去看看
http://topic.csdn.net/u/20081030/22/31029956-fa0d-46a5-8b14-e9c971f29054.html
重点是,1 保证只有2个实例可用,且每个实例的方法做成同步。
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;
/**
* 一个方法最多2个线程同时使用的实现。<br>
* 使用BlockingDeque保证同步的机制和阻塞访问。
*
* @author 老紫竹 JAVA世纪网(java2000.net)
*
*/
public class Test extends Thread {
public static void main(String[] args) {
for (int i = 0; i <= 10; i++) {
new Test().start();
}
}
public void run() {
int i = 2;
while (i-- > 0) {
OnlyTwo o = OnlyTwo.getInstance();
o.test();
OnlyTwo.returnInstance(o);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class OnlyTwo {
private static int NUM = 1;
private String name;
private OnlyTwo() {
name = "NUM" + NUM;
NUM++;
}
private static BlockingDeque<OnlyTwo> data = new LinkedBlockingDeque<OnlyTwo>(
2);
static {
data.push(new OnlyTwo());
data.push(new OnlyTwo());
}
public static OnlyTwo getInstance() {
try {
return data.takeFirst();
} catch (InterruptedException e) {
e.printStackTrace();
return null;
}
}
public static void returnInstance(OnlyTwo t) {
try {
data.putLast(t);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void test() {
// 实例同步,避免对象被重复使用
synchronized(this){
System.out.println("test" + name);
}
}
}
这个是我唯一想到的办法,我会仔细看其它朋友的信号,标志方法。从原理上想,难度很高,因为修改信号也需要同步,如果全部同步,就只能保证一个线程能访问了。
学无止境。。。
题目来自论坛,有兴趣的可以去看看
http://topic.csdn.net/u/20081030/22/31029956-fa0d-46a5-8b14-e9c971f29054.html
重点是,1 保证只有2个实例可用,且每个实例的方法做成同步。
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;
/**
* 一个方法最多2个线程同时使用的实现。<br>
* 使用BlockingDeque保证同步的机制和阻塞访问。
*
* @author 老紫竹 JAVA世纪网(java2000.net)
*
*/
public class Test extends Thread {
public static void main(String[] args) {
for (int i = 0; i <= 10; i++) {
new Test().start();
}
}
public void run() {
int i = 2;
while (i-- > 0) {
OnlyTwo o = OnlyTwo.getInstance();
o.test();
OnlyTwo.returnInstance(o);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class OnlyTwo {
private static int NUM = 1;
private String name;
private OnlyTwo() {
name = "NUM" + NUM;
NUM++;
}
private static BlockingDeque<OnlyTwo> data = new LinkedBlockingDeque<OnlyTwo>(
2);
static {
data.push(new OnlyTwo());
data.push(new OnlyTwo());
}
public static OnlyTwo getInstance() {
try {
return data.takeFirst();
} catch (InterruptedException e) {
e.printStackTrace();
return null;
}
}
public static void returnInstance(OnlyTwo t) {
try {
data.putLast(t);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void test() {
// 实例同步,避免对象被重复使用
synchronized(this){
System.out.println("test" + name);
}
}
}
这个是我唯一想到的办法,我会仔细看其它朋友的信号,标志方法。从原理上想,难度很高,因为修改信号也需要同步,如果全部同步,就只能保证一个线程能访问了。
学无止境。。。
相关文章推荐
- java基础问题---java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用
- java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?
- Java 有几程方法可以实现一个线程?用什么关键字修饰同步?stop()和suspend()为什么不推荐使用?
- java中有几种方法可以实现一个线程?用什么关键字修饰同步方法 stop()和suspend()方法为何不推荐使用?
- java 中有几种方法可以实现一个线程? 用什么关键字修 饰同步方法? stop()和 suspend()方法为何不推荐使用?
- Java中有几种方法实现一个线程,用什么关键字修饰同步方法?stop()和suspend()方法为何不提倡使用?
- java开发线程篇1:java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?
- java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用
- 【Java面试题】23 java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?
- java中俩种方法实现一个线程,以及不推荐使用stop()和suspend()方法
- 一个很简单的demo来演示一个账号只能同时被一个人使用(Java实现)
- JAVA线程之一:实现一个线程的两种方法
- javaweb实现一个账号只能同时被一个人使用(Java实现)
- java中有几种方法可以实现一个线程?
- 简单完整的代码,通过这个代码你将对RSA加密算法在Java中的实现方法有一个初步的了解,这个类,你可以直接使用,水平高的,就自己修改完善下代码。
- java 使用线程监控文件目录变化的实现方法
- Java多线程之~~~使用CountDownLatch来同步多个线程实现一个任务
- Spring MVC配置双数据源实现一个java项目同时连接两个数据库的方法
- java中有几种方法可以实现一个线程
- java中可以实现一个线程的方法