`

Java线程:新特征-信号量

 
阅读更多

Java线程:新特征-信号量

 
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中的 `Semaphore` 类可以用于限制多个线程访问共享资源的数量。 #### 十四、Java线程:新特征...

    学习多线程之一:线程通信--利用事件对象.zip_线程通信

    事件对象,通常称为信号量或事件标志,在Windows API中,它是一个内建的同步机制,允许线程等待特定事件的发生,或者通过设置事件状态通知其他线程。在Java中,我们可以使用java.util.concurrent包下的Semaphore或...

    JAVA多线程--信号量(Semaphore)_.docx

    JAVA多线程--信号量(Semaphore) 信号量(Semaphore)是一种多线程环境下的设施,负责协调各个线程,以保证它们能够正确、合理地使用公共资源。从概念上讲,信号量维护了一个许可集。 信号量的类型有两种:单值信号...

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

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

    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线程:新特征 - **线程池** `ExecutorService` 和 `Executors` 提供了一种高效地管理线程的方式,减少了线程创建和销毁的开销。 - **有返回值的线程** 通过 `Callable` 接口和 `Future` 类可以...

    JAVA线程高级-线程按序交替执行

    - JUC包含了许多高级并发组件,如`Semaphore`信号量、`CyclicBarrier`回环栅栏、`CountDownLatch`倒计时器和`Exchanger`交换器等,它们可以帮助控制线程的执行顺序。 - `Semaphore`可以限制同时访问特定资源的线程...

    图灵图书:图解JAVA多线程设计模式

    - **Semaphore:** 信号量,控制同时访问特定资源的线程数量。 #### 设计模式在多线程中的应用 **生产者消费者模式:** - **定义:** 一种解决缓冲区同步问题的经典模式,其中生产者负责生产数据放入缓冲区,消费...

    multithreading

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

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

    #### 五、Java线程的新特征详解 - **线程池**:高效地复用一组线程来执行任务,减少了创建和销毁线程的开销。 - **有返回值的线程**:通过`Callable`和`Future`实现线程的返回值,提供了更灵活的异步编程模型。 - *...

    Java线程间的通信----生产者消费者模型

    - `Semaphore`信号量:控制同时访问特定资源的线程数量。 - `CyclicBarrier`循环栅栏:允许一组线程等待彼此到达某个点,然后一起继续。 - `CountDownLatch`计数器门锁:一次性释放所有等待线程,常用于初始化...

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

    信号量(Semaphore)是操作系统中一种重要的同步机制,它用于管理多个线程对共享资源的访问,以防止并发执行时产生竞态条件。在多线程编程中,当多个线程试图同时访问一个有限的资源时,信号量可以帮助我们协调这些...

    Java多线程编程实战指南-核心篇

    Java提供了多种同步工具,如synchronized关键字、wait()和notify()方法、Lock接口(包括ReentrantLock可重入锁)以及Semaphore信号量等。这些工具能够确保共享资源在多线程访问时的安全性,防止数据竞争和死锁的发生...

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

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

    java常见面试题---线程篇

    - `Semaphore`:信号量,限制同时访问特定资源的线程数量。 理解并熟练掌握这些知识点,对于解决Java并发问题和优化多线程应用至关重要。在实际工作中,还需要关注线程安全、性能优化和代码可维护性等问题。

Global site tag (gtag.js) - Google Analytics