`

(转)使用java.util.concurrent实现的线程池、消息队列功能

    博客分类:
  • java
阅读更多
(转)使用java.util.concurrent实现的线程池、消息队列功能

昨天开始研究java.util.concurrent,是出于线程安全的知识懂得不多,对自己写的线程池没有信心,所以就用了包里专家写好的线程池。这个包的功能很强大。有兴趣的朋友可以搜索了解更多的内容。
     今天刚写好了一段200行左右的代码,拿出来跟大家分享我的学习经验。初次实践,不足之处,望能得到高手的指点。
功能说明:一个发送消息模块将消息发送到消息队列中,无需等待返回结果,发送模块继续执行其他任务。消息队列中的指令由线程池中的线程来处理。使用一个Queue来存放线程池溢出时的任务。
TestDriver.java是一个驱动测试,sendMsg方法不间断的向ThreadPoolManager发送数据。
01
public class TestDriver
02
{
03
    ThreadPoolManager tpm = ThreadPoolManager.newInstance();
04

05
    public void sendMsg( String msg )
06
    {
07
        tpm.addLogMsg( msg + "记录一条日志 " );
08
    }
09

10
    public static void main( String[] args )
11
    {
12
        for( int i = 0; i < 100; i++ )
13
        {
14
            new TestDriver().sendMsg( Integer.toString( i ) );
15
        }
16
    }
17
}


ThreadPoolManager类:是负责管理线程池的类。同时维护一个Queue和调度进程。

01
public class ThreadPoolManager
02
{
03
private static ThreadPoolManager tpm = new ThreadPoolManager();
04

05
// 线程池维护线程的最少数量
06
private final static int CORE_POOL_SIZE = 4;
07

08
// 线程池维护线程的最大数量
09
private final static int MAX_POOL_SIZE = 10;
10

11
// 线程池维护线程所允许的空闲时间
12
private final static int KEEP_ALIVE_TIME = 0;
13

14
// 线程池所使用的缓冲队列大小
15
private final static int WORK_QUEUE_SIZE = 10;
16

17
// 消息缓冲队列
18
Queue<String> msgQueue = new LinkedList<String>();
19

20
// 访问消息缓存的调度线程
21
final Runnable accessBufferThread = new Runnable()
22
{
23
  public void run()
24
  {
25
   // 查看是否有待定请求,如果有,则创建一个新的AccessDBThread,并添加到线程池中
26
   if( hasMoreAcquire() )
27
   {
28
    String msg = ( String ) msgQueue.poll();
29
    Runnable task = new AccessDBThread( msg );
30
    threadPool.execute( task );
31
   }
32
  }
33
};
34

35
final RejectedExecutionHandler handler = new RejectedExecutionHandler()
36
{
37
  public void rejectedExecution( Runnable r, ThreadPoolExecutor executor )
38
  {
39
   System.out.println(((AccessDBThread )r).getMsg()+"消息放入队列中重新等待执行");
40
   msgQueue.offer((( AccessDBThread ) r ).getMsg() );
41
  }
42
};
43

44
// 管理数据库访问的线程池
45
final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
46
   CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS,
47
   new ArrayBlockingQueue( WORK_QUEUE_SIZE ), this.handler );
48

49
// 调度线程池
50
final ScheduledExecutorService scheduler = Executors
51
   .newScheduledThreadPool( 1 );
52

53
final ScheduledFuture taskHandler = scheduler.scheduleAtFixedRate(
54
   accessBufferThread, 0, 1, TimeUnit.SECONDS );
55

56
public static ThreadPoolManager newInstance()
57
{
58
  return tpm;
59
}
60

61
private ThreadPoolManager(){}
62

63
private boolean hasMoreAcquire()
64
{
65
  return !msgQueue.isEmpty();
66
}
67

68
public void addLogMsg( String msg )
69
{
70
  Runnable task = new AccessDBThread( msg );
71
  threadPool.execute( task );
72
}
73
}


AccessDBThread类:线程池中工作的线程。

01
public class AccessDBThread implements Runnable
02
{
03
private String msg;
04
 
05
public String getMsg()
06
{
07
  return msg;
08
}
09

10
public void setMsg( String msg )
11
{
12
  this.msg = msg;
13
}
14
 
15
public AccessDBThread(){
16
  super();
17
}
18
 
19
public AccessDBThread(String msg){
20
  this.msg = msg;
21
}
22

23
public void run()
24
{
25
  // 向数据库中添加Msg变量值
26
  System.out.println("Added the message: "+msg+" into the Database");
27
}
28

29
}
分享到:
评论

相关推荐

    java.util.concurrent 实现线程池队列

    本篇文章将深入探讨如何使用`java.util.concurrent` 实现线程池队列,以及其中的关键概念和技术。 线程池是一种线程使用模式,通过预先创建并维护一定数量的工作线程来避免频繁创建和销毁线程的开销。在Java中,`...

    java并发工具包 java.util.concurrent中文版用户指南pdf

    1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...

    浅谈java.util.concurrent包中的线程池和消息队列

    "java.util.concurrent包中的线程池和消息队列" java.util.concurrent包中的线程池和消息队列是一种高效的多线程编程技术,主要用于解决处理器单元内多个线程执行的问题。线程池技术可以显著减少处理器单元的闲置...

    java.util.concurrent 学习ppt

    Java.util.concurrent的引入是为了解决传统并发原语如wait()、notify()、synchronized和volatile的使用难度大、容易出错以及性能问题。 在并发编程中,我们经常会遇到需要管理多个线程执行任务的情况。传统的做法是...

    JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用

    "JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用" JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用是Java多线程编程中的一种重要概念。随着多线程编程的普及,线程池的使用变得...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版.pdf

    java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...

    java并发工具包 java.util.concurrent中文版pdf

    ### Java并发工具包 `java.util.concurrent` 知识点详解 #### 一、引言 随着多核处理器的普及和应用程序复杂度的增加,多线程编程成为了现代软件开发不可或缺的一部分。为了简化并发编程的复杂性,Java 5 引入了 `...

    Java实现的线程池、消息队列功能

    标题中的“Java实现的线程池、消息队列功能”是指在Java编程中,如何利用编程技术实现线程池和消息队列这两种重要的并发处理机制。线程池和消息队列是解决多线程环境下资源管理和任务调度的有效手段,它们在高并发、...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版

    本资源包含两个 pdf 文档,一本根据 Jakob Jenkov 最新博客 (http://tutorials.jenkov.com/java-util-concurrent/index.html) 整理的 java_util_concurrent_user_guide_en.pdf,一个中文翻译的 java_util_concurrent...

    java并发工具包 java.util.concurrent中文版-带书签版

    Java并发工具包(java.util.concurrent)是Java平台上用于高效、安全地处理多线程编程的重要组件。这个包包含了丰富的并发工具类,旨在帮助开发者构建高度并发的程序,提高程序的性能和可伸缩性。本资源是该工具包的...

    java.util.concurrent 测试源文件

    Java.util.concurrent(JUC)是Java平台中的一个核心包,专门用于处理多线程并发问题。这个包包含了大量的工具类和接口,极大地简化了并发编程的复杂性,提高了程序的性能和可伸缩性。本测试源文件主要是针对JUC并发...

    java.util.concurrent介绍(重要).pdf

    此外,`java.util.concurrent` 包的实现充分利用了 JVM 的并发优化,如 CAS(Compare And Swap)操作,以实现高效无锁的数据结构。 总之,`java.util.concurrent` 提供的工具使得并发编程变得更加容易和高效,是 ...

    atlassian-util-concurrent-0.0.12.jar.zip

    - **线程池管理**:Atlassian Util Concurrent库提供了一种定制化的线程池实现,允许开发者根据具体需求调整线程数量、任务队列策略等,从而有效地管理和控制并发执行的任务。 - **锁和同步机制**:库中包含了各种...

    关于 java.util.concurrent 您不知道的 5 件事,第 2 部分

    在Java编程领域,`java.util.concurrent`包是并发编程的核心工具包,提供了高效、线程安全的类和接口,使得开发者能够更容易地处理多线程环境。本篇将深入探讨这个包中一些鲜为人知的知识点,以帮助你提升并发编程的...

    java 线程池实现多并发队列后进先出

    在Java中,可以使用`java.util.Deque`接口的实现,例如`java.util.concurrent.LinkedBlockingDeque`,它支持双端插入和删除,可以作为线程池的工作队列。 - 在创建`ThreadPoolExecutor`时,可以通过传递`...

    concurrent线程池的实现技术分析

    Java的并发库(java.util.concurrent)提供了丰富的线程池实现,包括`ThreadPoolExecutor`,它是基于工作窃取算法的高效线程池。本文主要分析的是基于`concurrent`包的一个特定线程池实现,探讨其实现原理和源码。 ...

    java_util_concurrent_user_guide

    1. **线程池**: `java.util.concurrent.ExecutorService` 是线程池的基础接口,它允许我们管理一组可重用的工作线程,以提高效率和资源利用率。`ThreadPoolExecutor` 是最常用的实现,可以自定义核心线程数、最大...

    Android中的线程池与任务队列

    在Android中,我们通常使用`java.util.concurrent`包下的`ExecutorService`接口和其相关的类来创建线程池。 线程池的核心概念包括: 1. 工作线程(Worker Threads):线程池中的线程,负责执行任务。 2. 任务队列...

Global site tag (gtag.js) - Google Analytics