iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么用JAVA实现简单Thread缓冲池
  • 666
分享到

怎么用JAVA实现简单Thread缓冲池

2023-06-03 01:06:43 666人浏览 泡泡鱼
摘要

本篇内容主要讲解“怎么用JAVA实现简单Thread缓冲池”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用JAVA实现简单Thread缓冲池”吧!在应用中,我们常常需要Thread缓冲池来做

本篇内容主要讲解“怎么用JAVA实现简单Thread缓冲池”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用JAVA实现简单Thread缓冲池”吧!

在应用中,我们常常需要Thread缓冲池来做一些事以提高程序的效率和并发性。本文演示了如何利用Queue这种数据结构实现一个简单的Thread缓冲池。

一个Thread缓冲池可以设计成以下这样:缓冲池由几个工作Thread和一个Queue组成,Client负责把任务放到Queue里面(put方法),而工作Thread就依次取出这些任务并执行它们(get方法)。

Queue的一个经典实现是使用一个循环数组(这个实现在很多数据结构的书上都有介绍),如一个大小为size的数组,这个循环数组可以被想象成首尾相连的一个环。oldest指向Queue中最老的数据所在的位置,next指向下一个可以放新数据的位置。

放入一个新数据到next的位置后,需要更新next:next = (next + 1) % size;

从oldest位置取出一个数据后,需要更新oldest:oldest = (oldest + 1) % size;

当oldest == next的时候,Queue为空,

当(next + 1) % size == oldest的时候,Queue为满。

(注意:为了区分Queue为空和为满的情况,实际上Queue里面最多能放size-1个数据。)

因为这个Queue会同时被多个线程访问,需要考虑在这种情况下Queue如何工作。首先,Queue需要是线程安全的,可以用Java里的synchronized关键字来确保同时只有一个Thread在访问Queue.

我们还可以注意到当Queue为空的时候,get操作是无法进行的;当Queue为满的时候,put操作又是无法进行的。在多线程访问遇到这种情况时,一般希望执行操作的线程可以等待(block)直到该操作可以进行下去。比如,但一个Thread在一个空Queue上执行get方法的时候,这个 Thread应当等待(block),直到另外的Thread执行该Queue的put方法后,再继续执行下去。在Java里面,Object对象的 wait(),notify()方法提供了这样的功能。

把上面的内容结合起来,就是一个SyncQueue的类:

public class SyncQueue {

public SyncQueue(int size) {
_array = new Object[size];
_size = size;
_oldest = 0;
_next = 0;
}

public synchronized void put(Object o) {
while (full()) {
try {
wait();
} catch (InterruptedException ex) {
throw new ExceptionAdapter(ex);
}
}
_array[_next] = o;
_next = (_next + 1) % _size;
notify();
}

public synchronized Object get() {
while (empty()) {
try {
wait();
} catch (InterruptedException ex) {
throw new ExceptionAdapter(ex);
}
}
Object ret = _array[_oldest];
_oldest = (_oldest + 1) % _size;
notify();
return ret;
}

protected boolean empty() {
return _next == _oldest;
}

protected boolean full() {
return (_next + 1) % _size == _oldest;
}

protected Object [] _array;
protected int _next;
protected int _oldest;
protected int _size;
}

可以注意一下get和put方法中while的使用,如果换成if是会有问题的。这是个很容易犯的错误。;-)
在以上代码中使用了ExceptionAdapter这个类,它的作用是把一个checked Exception包装成RuntimeException。详细的说明可以参考我的避免在Java中使用Checked Exception一文。

接下来我们需要一个对象来表现Thread缓冲池所要执行的任务。可以发现jdk中的Runnable interface非常合适这个角色。

最后,剩下工作线程的实现就很简单了:从SyncQueue里取出一个Runnable对象并执行它。

public class Worker implements Runnable {

public Worker(SyncQueue queue) {
_queue = queue;
}

public void run() {
while (true) {
Runnable task = (Runnable) _queue.get();
task.run();
}
}

protected SyncQueue _queue = null;

}

下面是一个使用这个Thread缓冲池的例子:

//构造Thread缓冲池
SyncQueue queue = new SyncQueue(10);
for (int i = 0; i < 5; i ++) {
new Thread(new Worker(queue)).start();
}
//使用Thread缓冲池
Runnable task = new MyTask();
queue.put(task);

为了使本文中的代码尽可能简单,这个Thread缓冲池的实现是一个基本的框架。当使用到实际中时,一些其他功能也可以在这一基础上添加,比如异常处理,动态调整缓冲池大小等等。

到此,相信大家对“怎么用JAVA实现简单Thread缓冲池”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 怎么用JAVA实现简单Thread缓冲池

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么用JAVA实现简单Thread缓冲池
    本篇内容主要讲解“怎么用JAVA实现简单Thread缓冲池”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用JAVA实现简单Thread缓冲池”吧!在应用中,我们常常需要Thread缓冲池来做...
    99+
    2023-06-03
  • Java简单实现线程池
    本文实例为大家分享了Java简单实现线程池的具体代码,供大家参考,具体内容如下 一、线程池 线程池是一种缓冲提高效率的技术。 相当于一个池子,里面存放大量已经创建好的线程,当有一个任...
    99+
    2024-04-02
  • 实现java简单的线程池
    目录拆分实现流程实现方式1.拒绝策略2.阻塞队列3.线程池和工作线程策略模式对比JDK的线程池线程池的状态转化总结拆分实现流程 请看下面这张图 首先我们得对线程池进行一个功能拆分 ...
    99+
    2024-04-02
  • 如何实现java简单的线程池
    这篇文章主要讲解了“如何实现java简单的线程池”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何实现java简单的线程池”吧!目录拆分实现流程实现方式拒绝策略阻塞队列线程池和工作线程策略模...
    99+
    2023-06-20
  • JAVA中字符串常量池和缓冲池的作用是什么
    这篇“JAVA中字符串常量池和缓冲池的作用是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JAVA中字符串常量池和缓冲池...
    99+
    2023-06-29
  • 怎么使用C++ Thread实现简单的socket多线程通信
    本篇内容介绍了“怎么使用C++ Thread实现简单的socket多线程通信”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!服务端多...
    99+
    2023-07-02
  • C++怎么实现一个简单的线程池
    本文小编为大家详细介绍“C++怎么实现一个简单的线程池”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++怎么实现一个简单的线程池”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、设计线程池应该包括保存线程的容...
    99+
    2023-06-30
  • Java实现一个简单的缓存方法
    缓存是在web开发中经常用到的,将程序经常使用到或调用到的对象存在内存中,或者是耗时较长但又不具有实时性的查询数据放入内存中,在一定程度上可以提高性能和效率。下面我实现了一个简单的缓存,步骤如下。创建缓存对象EntityCache.java...
    99+
    2023-05-31
    java 缓存 ava
  • Java怎么实现带缓冲的输入输出流
    本篇内容主要讲解“Java怎么实现带缓冲的输入输出流”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java怎么实现带缓冲的输入输出流”吧!缓冲是 I/O 的一种性能优化。缓冲流为 I/O 流增加...
    99+
    2023-06-29
  • java实现手写一个简单版的线程池
    有些人可能对线程池比较陌生,并且更不熟悉线程池的工作原理。所以他们在使用线程的时候,多数情况下都是new Thread来实现多线程。但是,往往良好的多线程设计大多都是使用线程池来实现...
    99+
    2024-04-02
  • java怎么实现简单的mock
    在Java中,可以使用Mockito库来实现简单的mock。Mockito是一个流行的Java mocking框架,可以用于模拟对象...
    99+
    2023-10-22
    java
  • Java字符缓冲流怎么使用
    这篇文章主要介绍“Java字符缓冲流怎么使用”,在日常操作中,相信很多人在Java字符缓冲流怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java字符缓冲流怎么使用”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-29
  • 用Python实现一个简单的线程池
    线程池的概念是什么?在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是 如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能...
    99+
    2023-01-31
    线程 简单 Python
  • MySQL中怎么实现查询缓冲
    今天就跟大家聊聊有关MySQL中怎么实现查询缓冲,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。如何调整MySQL查询缓冲QueryCache(下面简...
    99+
    2024-04-02
  • java怎么实现简单工作流
    在Java中实现简单工作流可以使用以下步骤:1. 定义工作流的流程图:确定每个工作流程节点的顺序和条件。2. 创建工作流程节点的类:...
    99+
    2023-08-31
    java
  • HTML 5中怎么实现缓冲效果
    这篇文章将为大家详细讲解有关HTML 5中怎么实现缓冲效果,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。这里是案例的演示代码:<!doctype&nb...
    99+
    2024-04-02
  • c++怎样实现一个简易的网络缓冲区的实践
    这期内容当中小编将会给大家带来有关c++怎样实现一个简易的网络缓冲区的实践,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. 前言请思考以下几个问题:1).为什么需要设计网络缓冲区,内核中不是有读写缓冲区...
    99+
    2023-06-22
  • Java中怎么实现Thread队列
    今天就跟大家聊聊有关Java中怎么实现Thread队列,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java Thread队列一直是我们需要掌握的代码。下面我们就基本思想:建立了一个...
    99+
    2023-06-17
  • 怎么用Java实现简单计算器功能
    这篇文章主要讲解了“怎么用Java实现简单计算器功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Java实现简单计算器功能”吧!一 项目说明实训目的:掌握 Java GUI 开发中的...
    99+
    2023-06-20
  • Java怎么实现简单的万年历
    以下是一个简单的Java实现万年历的代码示例:```javaimport java.util.Scanner;public clas...
    99+
    2023-08-15
    Java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作