您的位置:首页 > 编程语言 > Java开发

一个方法最多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);
    }
  }

}
这个是我唯一想到的办法,我会仔细看其它朋友的信号,标志方法。从原理上想,难度很高,因为修改信号也需要同步,如果全部同步,就只能保证一个线程能访问了。

学无止境。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java string .net c
相关文章推荐