`
yysct2005
  • 浏览: 87813 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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 线程系列博文总结word化,编目如下,欢迎互相...Java线程:新特征-信号量 Java线程:新特征-阻塞队列 Java线程:新特征-阻塞栈 Java线程:新特征-条件变量 Java线程:新特征-原子量 Java线程:新特征-障碍器

    Java 线程总结

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

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

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

    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

    multithreading

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

    java线程源码-Dinning-Philosopher-Problem:用线程和信号量概念的Dinning哲学家问题解决方案Java源代码

    java线程源码带有信号量和线程的Dinning哲学家问题。 信号量是整数变量,用于通过使用两个原子操作(用于过程同步的wait和signal)来解决关键部分问题。 等待和信号的定义如下: Wait-等待操作减小其参数s的值(如果...

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

    关于线程同步 synchronize,需要牢牢记住的第一点是:线程同步就是线程排队。同步就是排队。线程同步的目的就是避免线程“同步”执行。

    Java编程技巧(信号量,管道)

    在进行多线程编程时,经常要使用同步互斥机构,但Java本身没有提供的同步互斥机构,仅提供了两个与同步互斥有关的方法:wait()和notify(),可以用来设计信号量类:mySemaphore,它是按照Dijkstra提出的计数信号量的...

    java线程文档大全

    包含java线程的概念、原理、交互、合并、让步、守护、休眠、同步、锁以及新特性 锁 线程池 信号量 有返回值的线程 原子量 障碍器 阻塞列队和阻塞栈。java开发必备参考文档。

    Reader-Writer-Threading:java线程和信号量的读写器问题

    读写器线程 java线程和信号量的读写器问题

    java多线程每个线程挨着打印ABC的4种实现方式

    java多线程每个线程挨着打印ABC的4种实现方式,有4个线程t1、t2、t3、t4,t1打印A后t2打印A再t3打印A再t4打印A,然后从新回到t1打印B再t2打印B...t4打印B... 4个线程轮流打印abc... 一个线程可以理解为一个人,打印...

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

    主要介绍了JAVA 多线程之信号量(Semaphore)实例详解的相关资料,需要的朋友可以参考下

    Java编程线程间通信与信号量代码示例

    主要介绍了Java编程线程间通信与信号量代码示例,具有一定借鉴价值,需要的朋友可以参考下。

    JavaMultiThreading:锁,信号量和线程池的实现以及线程基础知识

    ->线程是轻量级进程。 这是同一程序的不同执行路径。 ->可用于并行运行同一程序的多个任务。 您如何在Java中创建线程? ->您可以通过扩展Thread类或通过实现可运行接口在Java中创建线程。 ->由于您只能扩展一次类,...

    java同步互斥信号量问题

    java同步互斥信号量问题 多线程的创建同步互斥函数P(),V()

    JAVA并发编程-2-线程并发工具类

    JAVA并发编程-2-线程并发工具类一、Fork/Join1、分而治之与工作密取2、使用标准范式3、Fork/Join的同步用法4、Fork/Join的异步用法二、CountDownLatch三、CyclicBarrier四、Semaphore信号量五、Exchanger ...

Global site tag (gtag.js) - Google Analytics