首页 > 编程语言 >Java - Semaphore 与 Exchanger

Java - Semaphore 与 Exchanger

时间:2022-10-28 12:32:47浏览次数:62  
标签:Java Service System Exchanger Semaphore println new public out


Semaphore 

  • 控制线程并发数量。
  • 内部维护一个等待队列,acquire 使配额减1,release 使配额加1。
package Chapter01;

import java.util.concurrent.Semaphore;

public class _01_Run {
/*
* 多进路-多处理:
* 等待队列中的线程同时,处理任务
*/
public static void main(String[] args) {
Service s = new Service();
MyThread []threads = new MyThread[12];
for (int i = 0; i < threads.length; i++) {
threads[i] = new MyThread(s);
threads[i].start();
}
}

static class Service {
private Semaphore s = new Semaphore(3);
void say() {
try {
s.acquire();
System.out.println("ThreadName = "+ Thread.currentThread().getName()+
" 准备中");
System.out.println("Begin "+ System.currentTimeMillis());
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()+
" 打印 "+ (i+1));
}
System.out.println("End " + System.currentTimeMillis());
s.release();
System.out.println("ThreadName = "+ Thread.currentThread().getName()+
"结束");
} catch (Exception e) {
// TODO: handle exception
}
}
}

static class MyThread extends Thread {
private Service s;

public MyThread(Service s) {
super();
this.s = s;
}

@Override
public void run() {
s.say();
}
}
}


Java - Semaphore 与 Exchanger_ide


package Chapter01;

import java.util.concurrent.Semaphore;
import java.util.concurrent.locks.ReentrantLock;

public class _02_Run {
/*
* 多进路-单处理:
* 等待队列中的线程,按照顺序(阻塞)执行任务
*/
public static void main(String[] args) {
Service s = new Service();
MyThread []threads = new MyThread[12];
for (int i = 0; i < threads.length; i++) {
threads[i] = new MyThread(s);
threads[i].start();
}
}

static class Service {
private Semaphore s = new Semaphore(3);
private ReentrantLock lock = new ReentrantLock();

void say() {
try {
s.acquire();
System.out.println("ThreadName = "+ Thread.currentThread().getName()+
" 准备中");
lock.lock();
System.out.println("Begin "+ System.currentTimeMillis());
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()+
" 打印 "+ (i+1));
}
System.out.println("End " + System.currentTimeMillis());
lock.unlock();
s.release();
System.out.println("ThreadName = "+ Thread.currentThread().getName()+
"结束");
} catch (Exception e) {
// TODO: handle exception
}
}
}

static class MyThread extends Thread {
private Service s;

public MyThread(Service s) {
super();
this.s = s;
}

@Override
public void run() {
s.say();
}
}
}


Java - Semaphore 与 Exchanger_java_02


Exchanger

  • 线程间交换数据。
  • 第一个线程先exchanger,然后等待领一个线程执行exchanger,然后二者交换数据。
package Chapter01;

import java.util.concurrent.Exchanger;

public class _03_Run {
/*
* exchange():
* 1. 线程A 会阻塞
* 2. 交换数据
*/
public static void main(String[] args) {
Exchanger<String> e = new Exchanger<String>();
ThreadA a = new ThreadA(e);
ThreadB b = new ThreadB(e);
a.start();
b.start();
}

static class ThreadA extends Thread {
private Exchanger<String> e;

public ThreadA(Exchanger<String> e) {
super();
this.e = e;
}

@Override
public void run() {
try {
System.out.println("A 中得到B 的值:" + e.exchange("a"));
} catch (Exception e) {
// TODO: handle exception
}
}
}

static class ThreadB extends Thread {
private Exchanger<String> e;

public ThreadB(Exchanger<String> e) {
super();
this.e = e;
}

@Override
public void run() {
try {
System.out.println("B 中得到A 的值:" + e.exchange("b"));
} catch (Exception e) {
// TODO: handle exception
}
}
}
}


Java - Semaphore 与 Exchanger_i++_03


推荐书目:《Java 编发编程 核心方法与框架》

标签:Java,Service,System,Exchanger,Semaphore,println,new,public,out
From: https://blog.51cto.com/u_11290086/5804357

相关文章

  • javaSE09基础-面向对象三大特征
    面向对象特征封装封装概念:封装,将类的某些信息隐藏在类内部,不允许外部访问,而且时通过该类提供的方法来实现对隐藏信息的操作和访问优点:隐藏类的实现细节类内部的结构可......
  • javaSE13-- API_常用类--默认继承Object--toString()--==与equals()[详解]
    API_常用类API应用程序编程接口API文档是对Java预定定义的类或接口功能和方法功能的说明文档,目的是提供给开发人员进行使用帮助说明默认继承Object,Java中所有类没有显示的......
  • java基础-->常用API之Scanner键盘录入
    Scanner类概述C++中有cin,scanf用来读取键盘中的数据。在java中使用Scanner类中的next方法来获取键盘中的数据。Scanner类的方法可以完成接收键盘录入的数据,接收的数据类......
  • Java - 对象的创建过程
    Java对象的创建过程(new的过程)在静态常量池中找到对应类的符号引用,检查该类是否被加载、解析,初始化(判断类是否加载);加载后,分配内存(指针碰撞或者空闲链表);零化内存空间;设置......
  • Java - 线程同步方式
    概念同步异步消息通信机制同步:发出调用之后,在没有得到结果之前,该调用不返回。调用者主动等待调用结果。异步:发出调用之后,该调用直接返回,无结果。被调用者通过状态、通......
  • Java - 重载 与 重写 的区别
    静态分派与动态分派1.静态类型[外观类型]=>方法执行版本=>编译期确定2.实际类型=>方法执行版本=>运行期确定静态解析与动态连接1.静态解析:符号引用(c......
  • Java - 类加载机制
    加载=>验证、准备、解析(链接)=>初始化类初始化时机1. 遇到new,getstatic,putstatic,invokestatic这四条字节码指令时,如果类没有进行过初始化,需要进行初始化......
  • Java - synchronized 和 volatile
    1.两者均可以实现可见性(线程B可以读到线程A更新的最新值)2.volatile本质就是告诉JVM,当前变量在寄存器中的值不确定,需要从主存中读取。synchronized锁定了当前变量,只有......
  • Java - Java 中的四种引用
    强引用Objecto=newObject();只要强引用还存在,垃圾回收器就永远不会回收掉该对象。软引用描述有用但是非必需的对象,使用softReference类来实现是否回收对象取决于J......
  • Java - 垃圾回收算法与垃圾回收器
    垃圾回收算法1.标记-清除过程:标记所有需要回收的对象,标记结束后,回收所有被标记的对象缺点:效率低下,容易造成碎片2.复制将内存空间分为两部分,每次只使用一部分,当一部分用......