原文:
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;
- 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虚拟机(JVM)能够支持的线程数量是一个复杂的话题,它涉及到多个因素,包括硬件资源、操作系统、JVM的实现以及程序本身的线程使用模式。以下是对这个主题的详细探讨: 首先,JVM的最大线程数并不有一个固定的...
在本文的例子中,使用`newFixedThreadPool(10)`创建了一个包含10个线程的固定大小线程池,这确保了服务器在任何时候最多有10个线程同时处理任务,从而控制了系统资源的消耗。 服务器模型的核心步骤如下: 1. **...
Java是一种广泛使用的面向对象的编程语言,其设计目标是具有高度的可移植性、健壮性和安全性。在软件开发领域,尤其是互联网应用和企业级应用中,Java扮演着至关重要的角色。随着技术的不断发展,Java程序员的需求也...
本文将详细介绍一个使用Java异步编程模型实现简单网络请求的例子。通过这个示例,我们可以了解到如何利用Java中的多线程机制和异步处理技术来提高程序的响应性和效率。此示例涉及的主要概念和技术包括:...
在第三个例子中,我们探索了线程的联合使用,即如何让一个线程等待另一个线程完成其工作。这通常通过`join()`方法实现。`join()`方法使得调用它的线程(这里是`main`线程)暂停执行,直到被联合的线程(这里是`...
4. **创建线程池**:使用`Executors`类的静态方法创建线程池,例如 `newFixedThreadPool(int nThreads)` 创建一个固定大小的线程池,其中线程数量是可预设的。 5. **使用线程池**: - **创建线程池对象**:如 `...
在多线程编程中,当多个线程试图同时访问一个有限的资源时,信号量可以帮助我们协调这些线程,确保资源的有序分配和释放。 信号量主要由两个操作组成:`P(Wait)操作`和`V(Signal)操作`。这两个操作通常被封装在...
#### 二、方法1:使用守护线程实现超时控制 这种方法通过创建一个守护线程来监控目标线程的执行时间。当达到预设的时间阈值时,守护线程会抛出一个自定义的未检测异常,从而通知目标线程超时发生。 ##### 1. 实现...
编写一个线程类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>...
ThreadPoolExecutor 是 Java 中的一个线程池实现类,它提供了四个构造方法,每个构造方法都可以用来创建一个线程池。其中,最后一个构造方法是最全的,它包括以下四个参数: 1. corePoolSize:核心线程数,表示...
在Java编程环境中,实现一个摄像头拍照程序涉及到多个关键知识点,主要涵盖了Java的图形用户界面(GUI)、设备访问、图像处理以及文件操作等技术。以下是对这些知识点的详细说明: 1. **Java AWT/Swing**: Java ...
在上述代码示例中,`JoinTest`类创建了一个新的线程`t`并启动,然后主线程调用了`t.join(1000)`,表示主线程将等待`t`线程最多1000毫秒。如果`t`线程在这1000毫秒内结束,那么`joinFinish`将被打印;反之,如果`t`...
这些内容通常涵盖在操作系统原理课程中,并且用Java语言来实现,可以提供一个直观的编程视角去理解操作系统的工作机制。 首先,PV操作源于荷兰计算机科学家Edsger Dijkstra提出的信号量机制,它是并发控制的一种...
synchronized方法可以确保在同一时间对每个类实例,它的声明为synchronized的成员函数最多只能有一个处于执行状态,从而避免了类成员变量访问产生冲突。synchronized块可以对任何代码块进行上锁,并且可以指定锁对象...
在Java中,`java.util.concurrent.Semaphore` 是一个计数信号量,可以用来控制同时访问特定资源的线程数量。在实现限流时,我们可以通过初始化Semaphore实例并设定许可证数量,从而限制并发线程数。例如: ```java ...
2. **多线程**:为了实现双人交替下棋,程序需要处理两个独立的线程,分别对应两个玩家,确保每次只有一个玩家可以进行操作。 3. **事件驱动编程**:当玩家在棋盘上下棋时,需要监听用户的输入事件,并根据这些事件...
### 使用Java匿名内部类实现一个简单的线程池 #### 一、引言 在现代软件开发中,线程池是管理并发任务的重要工具之一。它能够有效地控制运行中的线程数量,合理分配系统资源,避免频繁创建销毁线程带来的性能开销...
编写一个线程类AccessLimitInstanceClassThread,在其run()方法中获取一个LimitInstanceClass对象,调用获得的对象的writeAccessMessage(String message)将自己的线程名写入accessMessage,随机休眠0-5秒,再调用...
这里使用`Executors.newFixedThreadPool(threadNum)`创建了一个固定大小的线程池,线程池的大小为5,这意味着最多同时有5个线程执行任务。 3. **Fork/Join框架**:虽然代码中没有直接使用Fork/Join框架,但`...