返回顶部
首页 > 资讯 > 精选 >Java中怎么实现线程间通信与信号量
  • 554
分享到

Java中怎么实现线程间通信与信号量

java 2023-05-30 19:05:44 554人浏览 独家记忆
摘要

Java中怎么实现线程间通信与信号量,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.信号量Semaphore先说说Semaphore,Semaphore可以控制某个资源可

Java中怎么实现线程间通信与信号量,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

1.信号量Semaphore

先说说Semaphore,Semaphore可以控制某个资源可被同时访问的个数,通过acquire()获取一个许可,如果没有就等待,而release()释放一个许可。一般用于控制并发线程数,及线程间互斥。另外重入ReentrantLock也可以实现该功能,但实现上要复杂些。

功能就类似厕所有5个坑,假如有10个人要上厕所,那么同时只能有多少个人去上厕所呢?同时只能有5个人能够占用,当5个人中的任何一个人让开后,其中等待的另外5个人中又有一个人可以占用了。另外等待的5个人中可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会。

单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场合。

例子:

public static void main(String[] args) {  // 线程池  ExecutorService exec = Executors.newCachedThreadPool();  // 只能5个线程同时访问  final Semaphore semp = new Semaphore(5);  // 模拟20个客户端访问  for (int index = 0; index < 20; index++) {    final int NO = index;    Runnable run = new Runnable() {      public void run() {        try {          // 获取许可          semp.acquire();          System.out.println("获得Accessing: " + NO);          Thread.sleep((long) (Math.random() * 10000));          // 访问完后,释放          semp.release();          System.out.println("剩余可用信号-----------------"              + semp.availablePermits());        } catch (InterruptedException e) {          e.printStackTrace();        }      }    };    exec.execute(run);  }  // 退出线程池  exec.shutdown();}

输出结果(可以想想为什么会这样输出):

获得Accessing: 1获得Accessing: 5获得Accessing: 2获得Accessing: 3获得Accessing: 0剩余可用信号-----------------1获得Accessing: 4剩余可用信号-----------------1获得Accessing: 9剩余可用信号-----------------1获得Accessing: 8剩余可用信号-----------------1获得Accessing: 6剩余可用信号-----------------1获得Accessing: 10剩余可用信号-----------------1获得Accessing: 11剩余可用信号-----------------1获得Accessing: 12剩余可用信号-----------------1获得Accessing: 13剩余可用信号-----------------1获得Accessing: 7剩余可用信号-----------------1获得Accessing: 15剩余可用信号-----------------1获得Accessing: 16剩余可用信号-----------------1获得Accessing: 17剩余可用信号-----------------1获得Accessing: 14剩余可用信号-----------------1获得Accessing: 18剩余可用信号-----------------1获得Accessing: 19剩余可用信号-----------------1剩余可用信号-----------------2剩余可用信号-----------------3剩余可用信号-----------------4剩余可用信号-----------------5

2.使用PIPE作为线程间通信桥梁

Pipe有一个source通道和一个sink通道。数据会被写到sink通道,从source通道读取。一进一出。先作为初步了解怎么使用。

值得注意的是该类在java.NIO.channels下,说明该类属于nio方式的数据通信方式,那就使用Buffer来缓冲数据。

Pipe原理的图示:

Java中怎么实现线程间通信与信号量

Pipe就是个空管子,这个空管子一头可以从管子里往外读,一头可以往管子里写

操作流程:

首先要有一个对象往这个空管子里面写。写到哪里呢?这个空管子是有一点空间的,就在这个管子里。

写的时候就是写到管子本身包含的这段空间里的。这段空间大小是1024个字节。

然后另一个对象才能将这个装满了的管子里的内容读出来。

上代码

package com.jx.test;import java.io.IOException;import java.nio.ByteBuffer;import java.nio.channels.Pipe;public class testPipe {public static void main(String[] args) throws IOException {// 创建一个管道Pipe pipe = Pipe.open();final Pipe.SinkChannel psic = pipe.sink();// 要向管道写数据,需要访问sink通道final Pipe.SourceChannel psoc = pipe.source();// 从读取管道的数据,需要访问source通道Thread tPwriter = new Thread() {public void run() {try {System.out.println("send.....");// 创建一个线程,利用管道的写入口Pipe.SinkChannel类型的psic往管道里写入指定ByteBuffer的内容int res = psic.write(ByteBuffer              .wrap("Hello,Pipe!测试通讯.....".getBytes("utf-16BE")));System.out.println("send size:" + res);}catch (Exception e) {e.printStackTrace();}}};Thread tPreader = new Thread() {public void run() {int bbufferSize = 1024 * 2;ByteBuffer bbuffer = ByteBuffer.allocate(bbufferSize);try {System.out.println("recive.....");// 创建一个线程,利用管道的读入口Pipe.SourceChannel类型的psoc将管道里内容读到指定的ByteBuffer中          int res = psoc.read(bbuffer);//数据未System.out.println("recive size:"+res+" Content:" + ByteBufferToString(bbuffer));}catch (Exception e) {e.printStackTrace();}}};tPwriter.start();tPreader.start();}public static String ByteBufferToString(ByteBuffer content) {if (content == null || content.limit() <= 0        || (content.limit() == content.remaining())) {System.out.println("不存在或内容为空!");return null;}int contentSize = content.limit() - content.remaining();StringBuffer resultStr = new StringBuffer();for (int i = 0; i < contentSize; i += 2) {resultStr.append(content.getchar(i));}return resultStr.toString();}}

关于Java中怎么实现线程间通信与信号量问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网精选频道了解更多相关知识。

--结束END--

本文标题: Java中怎么实现线程间通信与信号量

本文链接: https://lsjlt.com/news/220528.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java中怎么实现线程间通信与信号量
    Java中怎么实现线程间通信与信号量,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.信号量Semaphore先说说Semaphore,Semaphore可以控制某个资源可...
    99+
    2023-05-30
    java
  • 怎么在java中实现线程间通信
    这篇文章将为大家详细讲解有关怎么在java中实现线程间通信,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。线程间通信:由于多线程共享地址空间和数据空间,所以多个线程间的通信是一个线程的数据可以...
    99+
    2023-05-30
    java
  • 怎么在java中实现线程通信
    本篇文章给大家分享的是有关怎么在java中实现线程通信,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应...
    99+
    2023-06-14
  • Java中怎么实现多线程通信
    Java中怎么实现多线程通信,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。概述多线程通信问题,也就是生产者与消费者问题生产者和消费者为两个线程,两个线程在运行过程中交替睡眠,生...
    99+
    2023-06-20
  • Java中实现线程间通信的实例教程
    目录前言1. 如何让两个线程依次执行?2. 如何让两个线程按照指定的方式有序相交?3. 线程 D 在A、B、C都同步执行完毕后执行4. 三个运动员分开准备同时开跑5. 子线程将结果返...
    99+
    2024-04-02
  • linux多线程编程详解教程(线程通过信号量实现通信代码)
    线程分类 线程按照其调度者可以分为用户级线程和核心级线程两种。 (1)用户级线程 用户级线程主要解决的是上下文切换的问题,它的调度算法和调度过程全部由用户自行选择决定,在运行时不需要特定的内核支持。在这里,...
    99+
    2022-06-04
    信号量 线程 多线程
  • Java怎么使用wait或notify实现线程间通信
    这篇文章主要介绍“Java怎么使用wait或notify实现线程间通信”,在日常操作中,相信很多人在Java怎么使用wait或notify实现线程间通信问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java怎...
    99+
    2023-07-04
  • Java中怎么使用wait和notify实现线程间的通信
    这篇“Java中怎么使用wait和notify实现线程间的通信”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java中怎么使...
    99+
    2023-06-30
  • 详谈java线程与线程、进程与进程间通信
    线程与线程间通信一、基本概念以及线程与进程之间的区别联系:关于进程和线程,首先从定义上理解就有所不同1、进程是什么?是具有一定独立功能的程序、它是系统进行资源分配和调度的一个独立单位,重点在系统调度和单独的单位,也就是说进程是可以独 立运行...
    99+
    2023-05-31
    进程 线程 通信
  • Java线程间通信方式
    前文了解了线程的创建方式和状态切换,在实际开发时,一个进程中往往有很多个线程,大多数线程之间往往不是绝对独立的,比如说我们需要将A和B 两个线程的执行结果收集在一起然后显示在界面上,又或者比较典型的消...
    99+
    2023-09-24
    java jvm 开发语言 android
  • android线程间怎么通信
    在Android中,线程间通信可以通过以下几种方式实现:1. Handler:可以通过Handler对象在不同的线程之间发送消息。每...
    99+
    2023-08-19
    android
  • Java中线程之间的通信是如何实现的
    这篇文章将为大家详细讲解有关Java中线程之间的通信是如何实现的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。正常情况下,每个子线程完成各自的任务就可以结束了。不过有的时候,我们希望多个线程...
    99+
    2023-05-31
    java 线程 通信
  • 怎么理解Java线程间通信与等待/通知机制
    本篇内容主要讲解“怎么理解Java线程间通信与等待/通知机制”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解Java线程间通信与等待/通知机制”吧!一、概念简介1、线程通信在操作系统中,线...
    99+
    2023-06-02
  • Java通过wait()和notifyAll()方法实现线程间通信
    本文实例为大家分享了Java实现线程间通信的具体代码,供大家参考,具体内容如下Java代码(使用了2个内部类):package Threads;import java.util.LinkedList;public class ProdCon...
    99+
    2023-05-31
    java wait notifyall
  • Java如何实现线程通信
    今天小编给大家分享一下Java如何实现线程通信的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。什么是线程通信、如何实现所谓线程...
    99+
    2023-06-30
  • Java编程之多线程死锁与线程间通信简单实现代码
    死锁定义 死锁是指两个或者多个线程被永久阻塞的一种局面,产生的前提是要有两个或两个以上的线程,并且来操作两个或者多个以上的共同资源;我的理解是用两个线程来举例,现有线程A和B同时操作两个共同资源a和b,A操作a的时候上锁LockA,继续执行...
    99+
    2023-05-30
    java 多线程 ava
  • Java中的多线程如何实现线程通信
    这篇文章将为大家详细讲解有关Java中的多线程如何实现线程通信,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java多线程中线程间的通信一、使用while方式来实现线程之间的通信packag...
    99+
    2023-05-31
    java 多线程 线程通信
  • Android中怎么实现进程间通信
    这篇文章给大家介绍Android中怎么实现进程间通信,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。由于android系统中应用程序之间不能共享内存。因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些。进程间通...
    99+
    2023-06-04
  • Java如何使用wait/notify实现线程间通信
    本文小编为大家详细介绍“Java如何使用wait/notify实现线程间通信”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java如何使用wait/notify实现线程间通信”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习...
    99+
    2023-07-04
  • Java学习之线程同步与线程间通信详解
    目录线程同步的概念同步代码块同步方法线程组线程组的相关方法线程组对象的基本应用线程间的通信线程通信简单应用线程同步的概念 由于同一个进程的多个线程共享同一块存储空间,在带来方便的同时...
    99+
    2022-12-27
    Java线程同步 Java线程通信 Java线程
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作