一个方法最多2个线程同时使用的JAVA实现


原文: http://www.java2000.net/p11416

题目来自论坛,有兴趣的可以去看看
http://topic.csdn.net/u/20081030/22/31029956-fa0d-46a5-8b14-e9c971f29054.html

重点是,1 保证只有2个实例可用,且每个实例的方法做成同步。
  1. import java.util.concurrent.BlockingDeque;
  2. import java.util.concurrent.LinkedBlockingDeque;
  3. /**
  4.  * 一个方法最多2个线程同时使用的实现。<br>
  5.  * 使用BlockingDeque保证同步的机制和阻塞访问。
  6.  * 
  7.  * @author 老紫竹 JAVA世纪网(java2000.net)
  8.  * 
  9.  */
  10. public class Test extends Thread {
  11.   public static void main(String[] args) {
  12.     for (int i = 0; i <= 10; i++) {
  13.       new Test().start();
  14.     }
  15.   }
  16.   public void run() {
  17.     int i = 2;
  18.     while (i-- > 0) {
  19.       OnlyTwo o = OnlyTwo.getInstance();
  20.       o.test();
  21.       OnlyTwo.returnInstance(o);
  22.       try {
  23.         Thread.sleep(10);
  24.       } catch (InterruptedException e) {
  25.         e.printStackTrace();
  26.       }
  27.     }
  28.   }
  29. }
  30. class OnlyTwo {
  31.   private static int NUM = 1;
  32.   private String name;
  33.   private OnlyTwo() {
  34.     name = "NUM" + NUM;
  35.     NUM++;
  36.   }
  37.   private static BlockingDeque<OnlyTwo> data = new LinkedBlockingDeque<OnlyTwo>(
  38.       2);
  39.   static {
  40.     data.push(new OnlyTwo());
  41.     data.push(new OnlyTwo());
  42.   }
  43.   public static OnlyTwo getInstance() {
  44.     try {
  45.       return data.takeFirst();
  46.     } catch (InterruptedException e) {
  47.       e.printStackTrace();
  48.       return null;
  49.     }
  50.   }
  51.   public static void returnInstance(OnlyTwo t) {
  52.     try {
  53.       data.putLast(t);
  54.     } catch (InterruptedException e) {
  55.       e.printStackTrace();
  56.     }
  57.   }
  58.   public  void test() {
  59.     // 实例同步,避免对象被重复使用
  60.     synchronized(this){
  61.       System.out.println("test" + name);
  62.     }
  63.   }
  64. }
这个是我唯一想到的办法,我会仔细看其它朋友的信号,标志方法。从原理上想,难度很高,因为修改信号也需要同步,如果全部同步,就只能保证一个线程能访问了。


学无止境。。。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
使用Java使用线程池并100个异步线程抢一把锁,可以结合上面提到的线程池和锁的示例代码,将它们结合起来。下面是一个示例代码: ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class ThreadPoolWithLockDemo { private static Lock lock = new ReentrantLock(); public static void main(String[] args) { // 创建线程池对象,使用FixedThreadPool类型 ExecutorService executor = Executors.newFixedThreadPool(5); // 提交任务 for (int i = 0; i < 100; i++) { executor.execute(new Task(i)); } // 关闭线程池 executor.shutdown(); } static class Task implements Runnable { private int id; public Task(int id) { this.id = id; } @Override public void run() { lock.lock(); try { System.out.println("Task " + id + " get the lock on thread " + Thread.currentThread().getName()); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); System.out.println("Task " + id + " release the lock on thread " + Thread.currentThread().getName()); } } } } ``` 在这个示例代码中,创建了一个FixedThreadPool类型的线程池,最多可以有5个线程同时执行任务。提交了100个任务,每个任务都是一个Runnable接口的实现类。任务执行时,会首先尝试获取锁,如果获取到了,则打印一条获取锁的信息,并且睡眠1秒钟模拟线程执行的过程。当线程执行结束时,会释放锁,并且打印一条释放锁的信息。最后,调用了线程池的shutdown()方法来关闭线程池。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值