`
javagongchengshi
  • 浏览: 1159 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

并发线程

阅读更多
/**
* 线程处理类
*/
public class ExecutorProcessPool {
private ExecutorService executor;
private static ExecutorProcessPool pool = new ExecutorProcessPool();
private final int threadMax = 50;

private ExecutorProcessPool() {
executor = ExecutorServiceFactory.getInstance().createFixedThreadPool(threadMax);
}

public static ExecutorProcessPool getInstance() {
return pool;
}
/**
* 获得当前活动线程数
* @return
*/
public int getActiveCount(){
return ((ThreadPoolExecutor)executor).getActiveCount();
}
/**
* 关闭线程池,这里要说明的是:调用关闭线程池方法后,线程池会执行完队列中的所有任务才退出
*
*/
public void shutdown() {
executor.shutdown();
}

/**
* 提交任务到线程池,可以接收线程返回值
*
* @param task
* @return
*/
public Future<?> submit(Runnable task) {
return executor.submit(task);
}

/**
* 提交任务到线程池,可以接收线程返回值
*
* @param task
* @return
*/
public Future<?> submit(Callable<?> task) {
return executor.submit(task);
}

/**
* 直接提交任务到线程池,无返回值
*
* @param task
*/
public void execute(Runnable task) {
executor.execute(task);
}

}


ExecutorProcessPool pool = ExecutorProcessPool.getInstance();
debug("pool.getActiveCount()=="+pool.getActiveCount());
ServiceResponse serviceResponse = new ServiceResponse();
Map map = new HashMap();
if(pool.getActiveCount()>=50){
debug("超出最大线程=="+pool.getActiveCount());
map.put("result", "并发超出最大线程数,请稍后在试");
}else{
pool.submit(new confirmApplicationThreadNewTask(serviceRequest));
map.put("result", "正在处理中,请稍后查询");
}
serviceResponse.setModel(map);


public class confirmApplicationThreadNewTask implements Callable<String> {
private ServiceRequest serviceRequest;

public confirmApplicationThreadNewTask(ServiceRequest serviceRequest){
this.serviceRequest=serviceRequest;
}

@Override
public String call() throws Exception {
ServiceResponse serviceResponse = confirmApplicationNew(serviceRequest);
Map map = serviceResponse.getModel();
ConfirmAppModel confirmAppModel = new ConfirmAppModel();
confirmAppModel.setApplicationNo(map.get("applicationNo")+"");
confirmAppModel.setReturnCode(map.get String json = JSON.toJSONString(map, true); 
confirmAppModel.setJson(json);

APIServiceUtil.getAPIClientService(context).confirmApplicationThreadNew(confirmAppModel);
return null;
}
}


public class ExecutorServiceFactory {
private static ExecutorServiceFactory executorFactory = new ExecutorServiceFactory();
    /**
     * 定时任务线程池
     */
    private ExecutorService executors;

    private ExecutorServiceFactory() {
   
    }

    /**
     * 获取ExecutorServiceFactory
     *
     * @return
     */
    public static ExecutorServiceFactory getInstance() {
        return executorFactory;
    }

    /**
     * 创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。
     *
     * @return
     */
    public ExecutorService createScheduledThreadPool() {
        // CPU个数
        int availableProcessors = Runtime.getRuntime().availableProcessors();
        // 创建
        executors = Executors.newScheduledThreadPool(availableProcessors * 10, getThreadFactory());
        return executors;
    }

    /**
     * 创建一个使用单个 worker 线程的
     * Executor,以无界队列方式来运行该线程。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,
     * 那么如果需要,一个新线程将代替它执行后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其他等效的
     * newFixedThreadPool(1) 不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。
     *
     * @return
     */
    public ExecutorService createSingleThreadExecutor() {
        // 创建
        executors = Executors.newSingleThreadExecutor(getThreadFactory());
        return executors;
    }
   
    /**
     * 创建一个使用单个 worker 线程的
     * Executor,以无界队列方式来运行该线程。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,
     * 那么如果需要,一个新线程将代替它执行后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其他等效的
     * newFixedThreadPool(1) 不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。
     *
     * @return
     */
    public ExecutorService createNewScheduledThreadPool (int size) {
        // 创建
        executors = Executors.newScheduledThreadPool(size,getThreadFactory());
        return executors;
    }

    /**
     * 创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用
     * execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60
     * 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。注意,可以使用 ThreadPoolExecutor
     * 构造方法创建具有类似属性但细节不同(例如超时参数)的线程池。
     *
     * @return
     */
    public ExecutorService createCachedThreadPool() {
        // 创建
        executors = Executors.newCachedThreadPool(getThreadFactory());
        return executors;
    }

    /**
     * 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。在任意点,在大多数 nThreads
     * 线程会处于处理任务的活动状态。如果在所有线程处于活动状态时提交附加任务
     * ,则在有可用线程之前,附加任务将在队列中等待。如果在关闭前的执行期间由于失败而导致任何线程终止
     * ,那么一个新线程将代替它执行后续的任务(如果需要)。在某个线程被显式地关闭之前,池中的线程将一直存在。
     *
     * @return
     */
    public ExecutorService createFixedThreadPool(int size) {
        // 创建
        executors = Executors.newFixedThreadPool(size, getThreadFactory());
        return executors;
    }


    /**
     * 获取线程池工厂
     *
     * @return
     */
    private ThreadFactory getThreadFactory() {
        return new ThreadFactory() {
            AtomicInteger sn = new AtomicInteger();
            public Thread newThread(Runnable r) {
                SecurityManager s = System.getSecurityManager();
                ThreadGroup group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup();
                Thread t = new Thread(group, r);
                t.setName("任务线程 - " + sn.incrementAndGet());
                return t;
            }
        };
    }
}

分享到:
评论

相关推荐

    调整Tomcat的并发线程

    在调整Tomcat的并发线程数以提高服务器处理并发请求数量的过程中,涉及到多个关键配置,其中最为重要的是server.xml文件的调整。Tomcat的并发能力主要受到maxThreads参数的控制,这是一个设定最大并发处理线程数的...

    32.8、高并发线程1

    【32.8、高并发线程1】讨论的主题是Java中的`ThreadLocal`,它是一种在并发编程中实现线程安全的重要工具。`ThreadLocal`的中文名称为“线程局部变量”,它允许每个线程拥有变量的一个独立副本,确保了在多线程环境...

    C#实现控制线程池最大数并发线程

    在处理高并发任务时,合理控制线程池中的并发线程数量至关重要,以确保系统资源得到充分利用,同时避免过度消耗导致性能瓶颈或崩溃。 在标题和描述中提到的场景,我们需要实现一个功能,即限制线程池中并发执行的...

    高并发线程配置建议-合理配置

    在实际应用中,针对高并发且任务执行时间短的业务,线程池线程数通常设置为CPU核数+1,以减少线程上下文切换的开销。对于并发不高但任务执行时间较长的情况,需要区分任务类型。如果是IO密集型,可以适当增加线程数...

    Qt、C++全栈聊天项目实战,并发线程,网络编程,boost::asio,json,grpc,protobuf,qt,mysql

    并发线程,网络编程,boost::asio,json,grpc,protobuf,qt,mysql,redis 等多种技术综合应用 2 项目运行 GateServer vs VerifyServer vscode,cmd 注意先 .\redis-server.exe .\redis.windows.conf 运行 ...

    C++ 聊天项目实战案例,涵盖grpc,并发线程,网络编程,qt开发,数据库等多种技术综合应用

    C++ 聊天项目实战案例,涵盖grpc,并发线程,网络编程,qt开发,数据库等多种技术综合应用

    IOS 创建并发线程的实例详解

    IOS 创建并发线程的实例详解 创建并发线程  主线程一般都是处理UI界面及用户交互的事儿的。其他的事一般就要另外的线程去处理,如下载,计算等。。。 现在先简单创建3个线程,分别打印出1-1000,,为了方便,线程3...

    java多线程并发编程例子

    6. **Semaphore**:信号量是一个控制同时访问特定资源的线程数量的工具,可以用来限制并发线程数。`TestSemaphore.java`可能包含了如何使用`Semaphore`来限制系统资源(如数据库连接)的并发访问。 7. **FutureTask...

    java多线程与并发1

    3. 管程:Java中的Semaphore、CountDownLatch、CyclicBarrier等同步工具,用于控制并发线程的数量或协调线程执行。 三、并发容器 1. 原生容器:ArrayList、LinkedList等不保证线程安全,而Vector、Stack则是线程...

    Java 模拟线程并发

    Java 模拟线程并发是编程领域中的一个重要概念,尤其在多核处理器和高并发应用中,理解并熟练掌握线程并发技术对于提升程序性能至关重要。在Java中,线程并发可以通过多种方式实现,包括继承Thread类、实现Runnable...

    java并发编程与高并发处理.xmind

    java并发编程总结,为xmind格式,总结的很详细,包含常见的并发容器,锁等知识

    人工智能-项目实践-多线程-Java多线程高并发实例.zip

    通过线程池,我们可以限制并发线程的数量,避免过度消耗系统资源。 2. **并发容器**:Java的`ConcurrentHashMap`、`CopyOnWriteArrayList`等并发容器提供线程安全的数据结构,使得多个线程可以安全地共享数据,而...

    java 多线程并发实例

    在Java编程中,多线程并发是提升程序执行效率、充分利用多核处理器资源的重要手段。本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是...

    C#线程 在某一时间内,只有N个线程在并发执行,其余都在队列中的实现

    在C#编程中,线程管理是一...这种方式有效地限制了并发线程数量,防止系统资源过度消耗,同时保证了程序的稳定性和数据的一致性。在asp.net或其他多线程应用中,这样的设计模式对于管理和优化系统性能是非常有价值的。

    软件性能测试并发数量计算公式(整理)

    软件性能测试计算公式(整理)术语及缩写词测试时间:一轮测试从开始到结束所使用的时间并发线程数:测试时同时访问被测系统的线程数。注意,由于测试过程中,每个线程都是以尽可能快的速度发请求,与实际用户的使用有...

    并发服务器-多线程服务器详解

    ### 并发服务器—多线程服务器详解 #### 一、引言 在现代软件开发中,特别是网络应用和服务的设计中,对并发处理能力的需求日益增长。为了满足高并发访问的需求,开发人员常采用多线程技术来构建高效、响应迅速的...

Global site tag (gtag.js) - Google Analytics