java信号量控制线程打印顺序的示例分享
import java.util.concurrent.Semaphore;
public class ThreeThread {
public static void main(String[] args) throws InterruptedException {
Semaphore sempA = new Semaphore(1);
Semaphore sempB = new Semaphore(0);
Semaphore sempC = new Semaphore(0);
int N=100;
Thread threadA = new PrintThread(N, sempA, sempB, "A");
Thread threadB = new PrintThread(N, sempB, sempC, "B");
Thread threadC = new PrintThread(N, sempC, sempA, "C");
threadA.start();
threadB.start();
threadC.start();
}
static class PrintThread extends Thread{
int N;
Semaphore curSemp;
Semaphore nextSemp;
String name;
public PrintThread(int n, Semaphore curSemp, Semaphore nextSemp, String name) {
N = n;
this.curSemp = curSemp;
this.nextSemp = nextSemp;
this.name = name;
}
public void run() {
for (int i = 0; i < N; ++i) {
try {
curSemp.acquire();
System.out.println(name);
nextSemp.release();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
}
相关推荐
-
JAVA 多线程之信号量(Semaphore)实例详解
java Semaphore 简介 信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确.合理的使用公共资源. 一个计数信号量.从概念上讲,信号量维护了一个许可集.如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可.每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者.但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动.拿到信号量的线程可以进入
-
详解java中的互斥锁信号量和多线程等待机制
互斥锁和信号量都是操作系统中为并发编程设计基本概念,互斥锁和信号量的概念上的不同在于,对于同一个资源,互斥锁只有0和1 的概念,而信号量不止于此.也就是说,信号量可以使资源同时被多个线程访问,而互斥锁同时只能被一个线程访问 互斥锁在java中的实现就是 ReetranLock , 在访问一个同步资源时,它的对象需要通过方法 tryLock() 获得这个锁,如果失败,返回 false,成功返回true.根据返回的信息来判断是否要访问这个被同步的资源.看下面的例子 public class Reen
-
Java并发编程Semaphore计数信号量详解
Semaphore 是一个计数信号量,它的本质是一个共享锁.信号量维护了一个信号量许可集.线程可以通过调用acquire()来获取信号量的许可:当信号量中有可用的许可时,线程能获取该许可:否则线程必须等待,直到有可用的许可为止. 线程可以通过release()来释放它所持有的信号量许可(用完信号量之后必须释放,不然其他线程可能会无法获取信号量). 简单示例: package me.socketthread; import java.util.concurrent.ExecutorService;
-
java信号量控制线程打印顺序的示例分享
复制代码 代码如下: import java.util.concurrent.Semaphore; public class ThreeThread { public static void main(String[] args) throws InterruptedException { Semaphore sempA = new Semaphore(1); Semaphore sempB = new Semaphore(0); Semaphore sempC = new Semapho
-
Java实现指定线程执行顺序的三种方式示例
本文实例讲述了Java实现指定线程执行顺序的三种方式.分享给大家供大家参考,具体如下: 方法一:通过共享对象锁加上可见变量来实现. public class MyService { private volatile int orderNum = 1; public synchronized void methodA() { try { while (orderNum != 1) { wait(); } for (int i = 0; i < 2; i++) { System.out.printl
-
Java 语言守护线程 Daemon Thread使用示例详解
目录 守护线程 用户线程设为守护线程 守护线程 在Java语言中有两类线程:用户线程和守护线程.我们通俗的讲,任意一个守护线程都是整个JVM中所有线程的"大管家":只要当前Java虚拟机中还有任意一个非守护线程没有结束,它们的守护线程就不能结束,要持续工作:只有当最后一个非守护线程结束时,守护线程才随着Java虚拟机一起结束工作. 其作用就是为其他线程的运行提供服务,就像是一个护道者,保证其他线程的顺利运行 用户线程设为守护线程 我们将用户线程设为守护线程的办法就是Thread类的se
-
java贪心算法初学感悟图解及示例分享
算法简介 1)贪心算法是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致是最好或者最优的算法 2)贪心算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果. 应用场景 --> 集合覆盖 public class GreedyAlgorithm { public static void main(String[] args) { // 创建广播电台,放入到Map HashMap<String, HashSet<
-
Java实现身份证号码验证源码示例分享
整理文档,搜刮出一个Java实现身份证号码验证源码示例代码,稍微整理精简一下做下分享. package xxx; /** * Created by wdj on 2017/6/21. */ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Random; /** * 身份证验证的
-
JAVA生产者消费者(线程同步)代码学习示例
一.问题描述 生产者消费者问题是一个典型的线程同步问题.生产者生产商品放到容器中,容器有一定的容量(只能顺序放,先放后拿),消费者消费商品,当容器满了后,生产者等待,当容器为空时,消费者等待.当生产者将商品放入容器后,通知消费者:当消费者拿走商品后,通知生产者. 二.解决方案 对容器资源加锁,当取得锁后,才能对互斥资源进行操作. 复制代码 代码如下: public class ProducerConsumerTest { public static void main(String []args
-
java基于AspectJ(面向切面编程)编码示例分享
一.基本概念 AspectJ是一种面向切面程序设计的基于Java 的实现.它向 Java 中加入了连接点(Join Point)这个新概念,其实它也只是现存的一个 Java概念的名称而已.它向 Java 语言中加入少许新结构:切点(pointcut).通知(Advice).类型间声明(Inter-type declaration)和方面(Aspect).切点和通知动态地影响程序流程,类型间声明则是静态的影响程序的类等级结构,而切面则是对所有这些新结构的封装. 基于切面.连接点.切点.通知的概念如
-
java模拟post请求登录猫扑示例分享
复制代码 代码如下: import java.io.BufferedReader;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.HttpURLConnection;im
-
Java分页工具类及其使用(示例分享)
Pager.java package pers.kangxu.datautils.common; import java.io.Serializable; import java.util.List; /** * * <b> 分页通用类 </b> * * @author kangxu * @param <T> * */ public class Pager<T> implements Serializable { /** * */ private stati
-
java实现voctor按指定方式排序示例分享
复制代码 代码如下: import java.util.*;class MyCompare implements Comparator //实现Comparator,定义自己的比较方法{public int compare(Object o1, Object o2) {Elem e1=(Elem)o1;Elem e2=(Elem)o2; if(e1.get() > e2.get())//这样比较是降序,如果把-1改成1就是升序.{ return -1;}else if(e1.get()<e
随机推荐
- 深入解析mysql.sock不见的问题
- javascript 选择文件夹对话框(web)
- Win2003 Server 安全的个人Web服务器
- JNDI,JTA和JMS简介
- IOS 开发之触摸事件详细介绍
- c#中带头(声明)的xml(封装)生成
- PHP常用技巧汇总
- DIV外区域Click后关闭DIV的实现代码
- js拦截alert对话框另类应用
- jQuery UI制作选项卡(tabs)
- C语言顺序表实现代码排错
- react-router4 嵌套路由的使用方法
- [C#].NET中几种Timer的使用实例
- C#开发教程之ftp操作方法整理
- 常见PHP数据库解决方案分析介绍
- PHP+MYSQL 出现乱码的解决方法
- Android 标准Intent的使用详解
- 简要对比C语言中的dup()函数和dup2()函数
- 双线路策略路由和脚本备份切换
- 垃圾回收器的相关知识点总结