`
LoveLZY
  • 浏览: 57347 次
  • 性别: Icon_minigender_1
博客专栏
Group-logo
从零编写RPC框架
浏览量:0
社区版块
存档分类
最新评论

java线程池demo

    博客分类:
  • java
阅读更多
接口
/**
 * Project Name:chenxun-framework-start
 * File Name:ThreadPool.java
 * Package Name:com.chenxun.framework.test
 * Date:2016年9月2日下午1:51:44
 * Copyright (c) 2016, www midaigroup com Technology Co., Ltd. All Rights Reserved.
 *
*/

package com.chenxun.framework.test;
/**
 * ClassName:ThreadPool <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Reason:	 TODO ADD REASON. <br/>
 * Date:     2016年9月2日 下午1:51:44 <br/>
 * @author   陈勋
 * @version  
 * @since    JDK 1.7
 * @see 	 
 */
public interface ThreadPool<Job extends Runnable> {
    /**
     * 
     * execute:(执行job). <br/>
     * @author 陈勋
     * @param job
     * @since JDK 1.7
     */
    void execute(Job job);
    /**
     * 
     * shutdown:(关闭线程池). <br/>
     *
     * @author 陈勋
     * @since JDK 1.7
     */
    void shutdown();
    /**
     * 
     * addWorkers:(增加工作者线程). <br/>
     * @author 陈勋
     * @param num
     * @since JDK 1.7
     */
    void addWorkers(int num);
    /**
     * 
     * removeWorker:(减少工作者线程). <br/>
     * @author 陈勋
     * @param num
     * @since JDK 1.7
     */
    void removeWorker(int num);
    /**
     * 
     * getJobSize:(获取等待执行的任务数量). <br/>
     *
     * @author 陈勋
     * @return
     * @since JDK 1.7
     */
    int getJobSize();

}




接口实现
/**
 * Project Name:chenxun-framework-start
 * File Name:DefualtThreadPool.java
 * Package Name:com.chenxun.framework.test
 * Date:2016年9月2日下午1:55:35
 * Copyright (c) 2016, www midaigroup com Technology Co., Ltd. All Rights Reserved.
 *
*/

package com.chenxun.framework.test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;

/**
 * ClassName:DefualtThreadPool <br/>
 * Function: TODO ADD FUNCTION. <br/>
 * Reason:	 TODO ADD REASON. <br/>
 * Date:     2016年9月2日 下午1:55:35 <br/>
 * @author   陈勋
 * @version  
 * @since    JDK 1.7
 * @see 	 
 */
public class DefualtThreadPool<Job extends Runnable> implements ThreadPool<Job > {
    //线程池最大限制数
    private static final int MAX_WORKER_NUMBERS=10;
    //线程池默认数量
    private static final int DEFAULT_WORKER_NUMBERS=5;
    //线程池最小连接数量
    private static final int MIN_WORKER_NUMBERS=1;
    //工作列表
    private final LinkedList<Job> jobs=new LinkedList<Job>();
    //工作者列表
    private final List<Worker> workers=Collections.synchronizedList(new
            ArrayList<Worker>());
    private int workerNum=MIN_WORKER_NUMBERS;
    //线程编号生成
    private AtomicLong threadNum=new AtomicLong();
    
    public DefualtThreadPool(){  
        initializeWorkers(DEFAULT_WORKER_NUMBERS);      
    }
    
    public DefualtThreadPool(int num){
        workerNum= num>MAX_WORKER_NUMBERS&&num<MIN_WORKER_NUMBERS?num:DEFAULT_WORKER_NUMBERS;
        initializeWorkers(num);      
    }
    
    
    
    @Override
    public void execute(Job job) {
       if(job!=null){
           //添加一个工作,然后进行通知
           synchronized (jobs) {
               jobs.addLast(job);
               jobs.notify();
        }
       } 
       
        
    }

    @Override
    public void shutdown() {
        for(Worker worker:workers){
            worker.shutdown();
        }
       
        
    }

    @Override
    public void addWorkers(int num) {
        synchronized (jobs) {
            if(num+this.workerNum>MAX_WORKER_NUMBERS){
                num=MAX_WORKER_NUMBERS-this.workerNum;
            }
            initializeWorkers(num);
            this.workerNum+=num;
        }
       
        
    }

    @Override
    public void removeWorker(int num) {
       synchronized (jobs) {
           if(num>=this.workerNum){
               throw new IllegalArgumentException("beyond workNum");
           }
           int count=0;
           while(count<num){
               Worker worker=workers.get(count);
               if(workers.remove(worker)){
                   worker.shutdown();
                   count++;
               }
               this.workerNum-=count;
           }
        
    }
        
    }

    @Override
    public int getJobSize() {
        return jobs.size();
    }
    
    private void initializeWorkers(int num){
        for(int i=0;i<num;i++){
            Worker worker=new Worker();
            workers.add(worker);
            Thread thread = new Thread(worker,"ThreadPool-Worker"+threadNum.incrementAndGet());
            thread.start();
            
        }
    }
    
    class Worker implements Runnable{
         private volatile boolean running=true;
        
        @Override
        public void run() {
            while(running){
                Job job=null;
                synchronized (jobs) {
                    while(jobs.isEmpty()){                      
                            try {
                                jobs.wait();
                            } catch (InterruptedException e) {                            
                               Thread.currentThread().interrupt();
                               return;                               
                            }
                        
                    }                  
                    job=jobs.removeFirst();                   
                }
                if(job!=null){
                    try{
                            job.run();
                        }catch (Exception e) {
                       
                    }
                    
                }
            }
            
            
            
        }
        
        public void shutdown(){
            running=false;
        }
        
    }

}

分享到:
评论

相关推荐

    Java版线程池实现

    Java线程池是一种高效管理并发任务执行的机制,它通过预先创建并维护一定数量的线程,从而避免了频繁地创建和销毁线程所带来的性能开销。在Java中,线程池的实现主要依赖于`java.util.concurrent`包中的`...

    轻量级java多线程池demo

    Java内置的`java.util.concurrent`包提供了一个强大的线程池实现——`ExecutorService`,通过`ThreadPoolExecutor`类可以自定义线程池配置。线程池通常包含核心线程数、最大线程数、线程空闲时间、工作队列等参数,...

    android线程池demo

    在Android中,我们可以使用Java的`java.util.concurrent`包中的`ExecutorService`和相关的类来创建和管理线程池。常见的线程池实现有`ThreadPoolExecutor`,它允许我们自定义线程池的核心参数,如核心线程数、最大...

    jdbc线程池演示demo

    在Java数据库连接(JDBC)中,线程池是一种优化数据库操作的重要技术。线程池可以提高应用程序的性能,减少创建和销毁线程的开销,同时管理并发访问数据库的多个请求。本实例中,我们将重点讨论如何使用C3P0这个开源...

    Java/Android线程池演示Demo

    总结,这个"Java/Android线程池演示Demo"旨在通过实例展示如何在Android和Java项目中使用线程池进行并发处理,帮助开发者理解线程池的工作原理和优势,以及如何根据应用需求配置和管理线程池。通过分析和实践这个...

    Android开发中线程池的使用Demo

    本示例"Android开发中线程池的使用Demo"将深入探讨如何在Android项目中有效利用线程池。 首先,我们需要了解Java中的ExecutorService接口,它是线程池的核心接口。通过ExecutorService,我们可以提交Runnable或...

    线程池的一个demo

    springboot线程池使用的一个demo,注解开发,很简单,下载即用

    线程池管理线程demo

    Java中,我们通常使用`Executors`类提供的静态工厂方法来创建线程池,如`newFixedThreadPool(int nThreads)`创建固定大小的线程池,`newSingleThreadExecutor()`创建只有一个线程的线程池,`newCachedThreadPool()`...

    线程池demo

    在Android中,常见的线程池实现是`java.util.concurrent.ThreadPoolExecutor`,我们可以根据实际需求设置核心线程数、最大线程数、线程存活时间以及时间单位。`ThreadPoolExecutor`还提供了`execute()`方法来提交...

    Java、Android多线程、线程池Demo

    在Java和Android开发中,多线程和线程池是两个关键的概念,它们对于提高程序的执行效率和优化系统资源的使用至关重要。本教程将深入探讨这两个主题,并通过一个名为"ThreadPoolDemo"的示例代码来阐述其核心原理和...

    binder线程池demo

    这个“binder线程池demo”是基于《开发艺术探索》一书中的示例,旨在帮助开发者理解如何在Android环境中有效地利用线程池进行IPC操作。以下是对这个主题的详细解释: 1. **Binder基础**:Binder是Android系统特有的...

    线程池Demo(待续)

    线程池是Java多线程编程中一个非常重要的概念,它可以帮助我们有效地管理和控制并发执行的线程,提高系统的资源利用率并保持系统稳定性。在Java中,`java.util.concurrent`包提供了线程池的实现,如`ExecutorService...

    Spring线程池demo

    本文将详细探讨在Spring框架中如何配置和使用线程池,并通过一个简单的示例——"Spring线程池demo"来展示其实现过程。 首先,我们需要了解线程池的基本原理。线程池通过预先创建一定数量的线程,当有任务需要执行时...

    JavaThreaddemo_DEMO_tidecme_线程池Java_

    Java线程池是一种高效管理线程的技术,它允许开发者预定义一组线程,这些线程可以重复使用,减少了创建和销毁线程的开销。在Java中,`java.util.concurrent` 包提供了线程池的相关实现,其中ExecutorService是线程池...

    java常用工具类封装

    Java中的线程池是由`java.util.concurrent`包中的`ExecutorService`接口及其实现类如`ThreadPoolExecutor`提供的。线程池可以有效地管理和控制并发执行的任务数量,避免频繁创建和销毁线程带来的性能开销。通过设置...

    线程池使用Demo

    线程池是Java并发编程中的重要概念,它是一种线程使用模式,用于高效地管理和执行大量并发任务。...`rxjavademo`这个Demo将帮助你更深入地理解如何在实际项目中运用线程池,以及结合RxJava进行异步编程。

    java线程池处理多并发,所有进程执行完后再统一处理结果

    java线程池处理多并发,所有进程执行完后再统一处理结果线程池配置类多线程并行demo 线程池配置类 import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation....

    java多线程Demo

    Java的ExecutorService和ThreadPoolExecutor提供了线程池的概念,它可以有效地管理和控制线程,避免大量创建和销毁线程带来的开销。通过ThreadPoolExecutor,我们可以定制线程池的大小、存活时间、任务队列等参数,...

    简单的java线程demo

    本示例"简单的Java线程demo"旨在帮助初学者理解如何在Java中创建和管理线程。 在Java中,有两种主要的方式来创建线程:继承Thread类和实现Runnable接口。下面我们将详细讨论这两个方法。 1. 继承Thread类: 当一个...

Global site tag (gtag.js) - Google Analytics