`
nowing
  • 浏览: 84794 次
  • 来自: ...
社区版块
存档分类
最新评论

Java线程:信号量

阅读更多
http://lavasoft.blog.51cto.com/62575/222469

Java的信号量实际上是一个功能完毕的计数器,对控制一定资源的消费与回收有着很重要的意义,信号量常常用于多线程的代码中,并能监控有多少数目的线程等待获取资源,并且通过信号量可以得知可用资源的数目等等,这里总是在强调“数目”二字,但不能指出来有哪些在等待,哪些资源可用。

因此,本人认为,这个信号量类如果能返回数目,还能知道哪些对象在等待,哪些资源可使用,就非常完美了,仅仅拿到这些概括性的数字,对精确控制意义不是很大。目前还没想到更好的用法。

下面是一个简单例子:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

/**
* Java线程:新特征-信号量
*
* @author leizhimin 2009-11-5 13:44:45
*/
public class Test {
        public static void main(String[] args) {
                MyPool myPool = new MyPool(20);
                //创建线程池
                ExecutorService threadPool = Executors.newFixedThreadPool(2);
                MyThread t1 = new MyThread("任务A", myPool, 3);
                MyThread t2 = new MyThread("任务B", myPool, 12);
                MyThread t3 = new MyThread("任务C", myPool, 7);
                //在线程池中执行任务
                threadPool.execute(t1);
                threadPool.execute(t2);
                threadPool.execute(t3);
                //关闭池
                threadPool.shutdown();
        }
}

/**
* 一个池
*/
class MyPool {
        private Semaphore sp;     //池相关的信号量

        /**
         * 池的大小,这个大小会传递给信号量
         *
         * @param size 池的大小
         */
        MyPool(int size) {
                this.sp = new Semaphore(size);
        }

        public Semaphore getSp() {
                return sp;
        }

        public void setSp(Semaphore sp) {
                this.sp = sp;
        }
}

class MyThread extends Thread {
        private String threadname;            //线程的名称
        private MyPool pool;                        //自定义池
        private int x;                                    //申请信号量的大小

        MyThread(String threadname, MyPool pool, int x) {
                this.threadname = threadname;
                this.pool = pool;
                this.x = x;
        }

        public void run() {
                try {
                        //从此信号量获取给定数目的许可
                        pool.getSp().acquire(x);
                        //todo:也许这里可以做更复杂的业务
                        System.out.println(threadname + "成功获取了" + x + "个许可!");
                } catch (InterruptedException e) {
                        e.printStackTrace();
                } finally {
                        //释放给定数目的许可,将其返回到信号量。
                        pool.getSp().release(x);
                        System.out.println(threadname + "释放了" + x + "个许可!");
                }
        }
}

任务B成功获取了12个许可!
任务B释放了12个许可!
任务A成功获取了3个许可!
任务C成功获取了7个许可!
任务C释放了7个许可!
任务A释放了3个许可!

Process finished with exit code 0

从结果可以看出,信号量仅仅是对池资源进行监控,但不保证线程的安全,因此,在使用时候,应该自己控制线程的安全访问池资源。
分享到:
评论

相关推荐

    Java多线程编程总结

    Java线程:概念与原理 ...Java线程:新特征-信号量 Java线程:新特征-阻塞队列 Java线程:新特征-阻塞栈 Java线程:新特征-条件变量 Java线程:新特征-原子量 Java线程:新特征-障碍器 Java线程:大总结

    java 线程同步 信号量控制同步

    信号量机制是 Java 中的一种线程同步机制。信号量是一个整数值,表示当前可用的资源数量。线程可以通过等待信号量来获取资源访问权限。信号量机制可以用于解决生产者-消费者问题、哲学家就餐问题等。 Java 中的 ...

    Java多线程编程经验

    #### 十六、Java线程:新特征-信号量 信号量是一种用于控制多个线程访问共享资源的机制,可以有效地限制并发访问的数量。 #### 十七、Java线程:新特征-阻塞队列 阻塞队列是一种特殊的队列,当队列为空时,从队列...

    Java 线程开发讲座

    #### 十四、Java线程:新特征-信号量 - **信号量**:用于控制对资源的访问次数,适用于多个资源的管理。 - **Semaphore类**:`Semaphore`类提供了信号量的功能。 #### 十五、Java线程:新特征-阻塞队列 - **阻塞...

    java多线程编程总结

    - **信号量** 通过 `Semaphore` 类来控制对有限资源的访问。 - **阻塞队列** `BlockingQueue` 提供了线程安全的队列实现,可以方便地用于生产者-消费者模型。 - **阻塞栈** `BlockingDeque` 类提供了一个线程...

    JavaMultiThreadingExamples:带有中文注释的基本Java多线程示例

    #Java多线程示例-Java多线程应用实例 1- Java多线程:启动线程 2- Java多线程:易失性–基本线程通信 3- Java多线程:同步 ...12- Java多线程:信号量 13- Java多线程:可调用和未来 14- Java多线程:中断线程 从分叉

    Java多线程

    #### 十六、Java线程:新特征-信号量 信号量是一种控制多个线程访问共享资源的方法,常用于限制可以访问某些资源的最大线程数。 #### 十七、Java线程:新特征-阻塞队列 阻塞队列是一种特殊的队列,它能够阻塞插入...

    Java_多线程编程线程:大总结

    - **信号量**:控制对有限资源的访问,如网络连接数限制。 - **阻塞队列**:用于线程间的数据交换,确保数据的正确性和安全性。 - **条件变量**:支持更复杂的线程同步场景。 - **原子量**:提供原子操作,避免了锁...

    JAVA 多线程之信号量(Semaphore)实例详解

    **JAVA 多线程之信号量Semaphore实例详解** 在Java多线程编程中,信号量Semaphore是一种非常重要的同步工具,用于控制对公共资源的访问。Semaphore类位于`java.util.concurrent`包下,它允许我们限制同时访问特定...

    MultithreadingJava:来自Cave of Programming http的John Purcell的Java多线程课程代码

    课程内容: 1- Java 多线程:启动线程 2- Java 多线程:Volatile – ...12- Java 多线程:信号量 13- Java 多线程:Callable 和 Future 14- Java 多线程:中断线程 15- Java 多线程:Swing 中的多线程与 SwingWorker

    Java进程信号量机制的实验程序

    Java进程信号量机制是多线程编程中一种有效的同步工具,它源于操作系统中的同步原语,用于管理和控制对共享资源的访问。在Java中,信号量由`java.util.concurrent.Semaphore`类实现,它提供了两种类型:可重用的二...

    JAVA多线程

    Java新特性中引入了线程池、`Future`和`Callable`接口支持有返回值的线程、高级锁机制、信号量、阻塞队列等,为多线程编程提供了更强大和灵活的支持。 综上所述,Java多线程编程涉及到线程的概念、创建与启动、线程...

    Java线程使用教程

    3. **Semaphore**:信号量,限制同时访问特定资源的线程数量。 4. **Atomic* 类**:提供原子操作的类,如`AtomicInteger`,保证在多线程环境下变量的更新不被中断。 五、死锁与活锁 1. **死锁**:两个或多个线程...

    Java多线程运算集合

    #### 十三、Java线程:新特征-信号量 - **信号量**: - 信号量是一种用于控制对共享资源访问次数的同步工具。 - Java中的 `Semaphore` 类可以用于限制多个线程访问共享资源的数量。 #### 十四、Java线程:新特征...

    java线程文档大全

    10. **信号量(Semaphore)**:信号量是一种同步工具,可以限制同时访问特定资源的线程数量。它通过acquire()和release()方法控制许可。 11. **有返回值的线程**:如果线程需要返回结果,可以使用Future和Callable...

    信号量机制实现线程同步

    6. **实际编程中的应用**:在Java中,可以使用`java.util.concurrent.Semaphore`类来实现信号量。创建时指定初始值,然后在线程中调用`acquire()`(等价于P操作)和`release()`(等价于V操作)方法来管理资源访问。 ...

    multithreading

    #Java多线程1- Java多线程:启动线程2- Java多线程:易失...Java多线程:低级生产者-消费者10- Java多线程:可重入锁11- Java多线程:死锁12- Java多线程:信号量13- Java多线程:可调用和未来14- Java多线程:中断线程

    关于线程(java)两天的课件

    Java提供了多种机制,如synchronized关键字、volatile变量、Lock接口(如ReentrantLock)以及信号量Semaphore。synchronized提供内置锁,保证同一时间只有一个线程访问临界区;volatile保证了变量在多线程环境中的...

    java线程与并发编程实践

    Java提供了一系列并发工具类,如Semaphore(信号量)、CyclicBarrier(循环屏障)、CountDownLatch(计数器门锁)和Exchanger(交换器),它们用于控制线程间访问资源的顺序和数量,协调多个线程间的操作。...

Global site tag (gtag.js) - Google Analytics