`
逆风的香1314
  • 浏览: 1453181 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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


学无止境。。。
评论

相关推荐

    Java虚拟机最多支持多少个线程的探讨

    Java虚拟机(JVM)能够支持的线程数量是一个复杂的话题,它涉及到多个因素,包括硬件资源、操作系统、JVM的实现以及程序本身的线程使用模式。以下是对这个主题的详细探讨: 首先,JVM的最大线程数并不有一个固定的...

    Java多线程实现.pdf

    在本文的例子中,使用`newFixedThreadPool(10)`创建了一个包含10个线程的固定大小线程池,这确保了服务器在任何时候最多有10个线程同时处理任务,从而控制了系统资源的消耗。 服务器模型的核心步骤如下: 1. **...

    最多最全的java面试题

    Java是一种广泛使用的面向对象的编程语言,其设计目标是具有高度的可移植性、健壮性和安全性。在软件开发领域,尤其是互联网应用和企业级应用中,Java扮演着至关重要的角色。随着技术的不断发展,Java程序员的需求也...

    使用Java异步编程实现一个简单的网络请求.txt

    本文将详细介绍一个使用Java异步编程模型实现简单网络请求的例子。通过这个示例,我们可以了解到如何利用Java中的多线程机制和异步处理技术来提高程序的响应性和效率。此示例涉及的主要概念和技术包括:...

    java 多线程小例子 很方便 很实用 适合初学者

    在第三个例子中,我们探索了线程的联合使用,即如何让一个线程等待另一个线程完成其工作。这通常通过`join()`方法实现。`join()`方法使得调用它的线程(这里是`main`线程)暂停执行,直到被联合的线程(这里是`...

    Java中多线程的使用线程池.docx

    4. **创建线程池**:使用`Executors`类的静态方法创建线程池,例如 `newFixedThreadPool(int nThreads)` 创建一个固定大小的线程池,其中线程数量是可预设的。 5. **使用线程池**: - **创建线程池对象**:如 `...

    使用信号量(Semaphore)实现线程的同步

    在多线程编程中,当多个线程试图同时访问一个有限的资源时,信号量可以帮助我们协调这些线程,确保资源的有序分配和释放。 信号量主要由两个操作组成:`P(Wait)操作`和`V(Signal)操作`。这两个操作通常被封装在...

    Java线程超时控制的实现.docx

    #### 二、方法1:使用守护线程实现超时控制 这种方法通过创建一个守护线程来监控目标线程的执行时间。当达到预设的时间阈值时,守护线程会抛出一个自定义的未检测异常,从而通知目标线程超时发生。 ##### 1. 实现...

    单例模式java代码

    编写一个线程类AccessLimitInstanceClassThread,在其run()方法中获取一个LimitInstanceClass对象,调用获得的对象的writeAccessMessage(String message)将自己的线程名写入accessMessage,随机休眠0-5秒,再调用...

    查找字符串中出现重复次数最多的字符

    下面是一个使用Java实现的示例代码,采用哈希表法: ```java import java.util.HashMap; import java.util.Map; public class FindChar { public static char findMostFrequentChar(String str) { Map, Integer&gt;...

    在spring boot中使用java线程池ExecutorService的讲解

    ThreadPoolExecutor 是 Java 中的一个线程池实现类,它提供了四个构造方法,每个构造方法都可以用来创建一个线程池。其中,最后一个构造方法是最全的,它包括以下四个参数: 1. corePoolSize:核心线程数,表示...

    摄像头拍照程序(java实现)

    在Java编程环境中,实现一个摄像头拍照程序涉及到多个关键知识点,主要涵盖了Java的图形用户界面(GUI)、设备访问、图像处理以及文件操作等技术。以下是对这些知识点的详细说明: 1. **Java AWT/Swing**: Java ...

    深入浅出Java多线程.doc

    在上述代码示例中,`JoinTest`类创建了一个新的线程`t`并启动,然后主线程调用了`t.join(1000)`,表示主线程将等待`t`线程最多1000毫秒。如果`t`线程在这1000毫秒内结束,那么`joinFinish`将被打印;反之,如果`t`...

    操作系统作业 (pv,作业管理,等5个的Java实现)

    这些内容通常涵盖在操作系统原理课程中,并且用Java语言来实现,可以提供一个直观的编程视角去理解操作系统的工作机制。 首先,PV操作源于荷兰计算机科学家Edsger Dijkstra提出的信号量机制,它是并发控制的一种...

    浅谈Java多线程编程.pdf

    synchronized方法可以确保在同一时间对每个类实例,它的声明为synchronized的成员函数最多只能有一个处于执行状态,从而避免了类成员变量访问产生冲突。synchronized块可以对任何代码块进行上锁,并且可以指定锁对象...

    java实现限流,封装的工具类

    在Java中,`java.util.concurrent.Semaphore` 是一个计数信号量,可以用来控制同时访问特定资源的线程数量。在实现限流时,我们可以通过初始化Semaphore实例并设定许可证数量,从而限制并发线程数。例如: ```java ...

    java自编双人五子棋程序.jar

    2. **多线程**:为了实现双人交替下棋,程序需要处理两个独立的线程,分别对应两个玩家,确保每次只有一个玩家可以进行操作。 3. **事件驱动编程**:当玩家在棋盘上下棋时,需要监听用户的输入事件,并根据这些事件...

    使用Java匿名内部类实现一个简单的线程池.txt

    ### 使用Java匿名内部类实现一个简单的线程池 #### 一、引言 在现代软件开发中,线程池是管理并发任务的重要工具之一。它能够有效地控制运行中的线程数量,合理分配系统资源,避免频繁创建销毁线程带来的性能开销...

    多例模式java实现

    编写一个线程类AccessLimitInstanceClassThread,在其run()方法中获取一个LimitInstanceClass对象,调用获得的对象的writeAccessMessage(String message)将自己的线程名写入accessMessage,随机休眠0-5秒,再调用...

    java多线程处理数据(csdn)————程序.pdf

    这里使用`Executors.newFixedThreadPool(threadNum)`创建了一个固定大小的线程池,线程池的大小为5,这意味着最多同时有5个线程执行任务。 3. **Fork/Join框架**:虽然代码中没有直接使用Fork/Join框架,但`...

Global site tag (gtag.js) - Google Analytics