JAVA并发处理经验(二)JAVA线程池运用与并发工具

简介: 一、前言前面一章是对县城池,自己的理解总结。只限目录二、线程池1】线程池主要都是ThreadpoolExetor都是Executors工厂生成2】生成线程线程池分类:newFIxe...

一、前言

前面一章是对县城池,自己的理解总结。只限目录

二、线程池

1】线程池主要都是ThreadpoolExetor都是Executors工厂生成
2】生成线程线程池分类:
newFIxedThread=============返回固定大小的线程池
newSingleThreadExecutor======返回单线程处理
newCachedThreadPool=======返回逐步增加线程数量的线程
newSingleThreadScheduleExecutor====单线程(有周期执行)计划线程
newScheduleThreadPool=========制定线程数量(有周期执行)
 1‘newScheduleThreadPool具体方法
  1’1 sheduleAtFixedRate:固定频率
                 1‘2 sheduleWithfixedDalay:相当频率
3】线程都有队列与拒绝策略
3’1synchronousQueue 直接提交队列
        3‘2 arrayBlokingQueue 有界队列
        3’3 LInkedBlokingQueue无界队列
       3‘4prirorityBlockingQueuq 优先级队列
 4】拒绝策略
4’1 abortPloicy策略 直接异常,阻止系统正常工作
        4‘2 CallerRunPolicy 一直霸占资源慢慢执行
        4’3 DiscardOldedestPloicy 丢弃最老的策略
        4‘4 DiscardPolicy 默默丢弃,程序不受困
5】ThreadPoolExecutor 提供before after等方法

6】线程池线程都可以自己线程创建ThreadFactory,但是一般都用默认即够用。

7】Runtime.getRuntime().availableProcessors 测试系统设置线程池的数量

8】在使用线程池execute与submit的区别;一般用submit获取异常

9】如果你需要可以自己扩展线程池【有效确定找到你程序报错地点】【一般看submit的futer应该够用】

10】JDK 7之后新的From/Join线程池,代码如下
package jDKMulit;

import java.util.ArrayList;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;

/**
 * Created by ycy on 16/1/13.
 */
public class CountTaskForkJoin extends RecursiveTask<Long> {
    private static final int THEESHOLD = 10000;
    private long start;
    private long end;

    public CountTaskForkJoin(long start, long end) {
        this.start = start;
        this.end = end;
    }

    @Override
    public Long compute() {
        long sum = 0;
        boolean canCpmpute = (end - start) < THEESHOLD;
        if (canCpmpute) {
            for (long i = start; i <= end; i++) {
                sum += i;
            }
        } else {
            //分为100个小任务
            long step = (start + end) / 100;
            ArrayList<CountTaskForkJoin> subTasks = new ArrayList<CountTaskForkJoin>();
            long pos = start;
            for (int i = 0; i < 100; i++) {
                long lastOne = pos + step;
                if (lastOne > end) lastOne = end;
                CountTaskForkJoin subTask = new CountTaskForkJoin(pos, lastOne);
                pos += step + 1;
                subTasks.add(subTask);
                subTask.fork();

            }
            for (CountTaskForkJoin t : subTasks) {
                sum += t.join();
            }
        }
        return sum;
    }

    public static void main(String[] args) {
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        CountTaskForkJoin task = new CountTaskForkJoin(0, 200000l);
        ForkJoinTask<Long> rsult = forkJoinPool.submit(task);
        try {
            long res = rsult.get();
            System.out.println("sum=" + res);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

11】JDK下面的并发容器

11.1  ConcurrentHashmap:线程安全hsamap
112. CopyOnwriteArrayList:快速读取的list
        11.3ConcurrentLinkList:线程安全的LIkedList
        11.4BlockingQueue:线程阻塞的数据队列
        11.5ConcurrentSkipListMap:跳表
11.6 高效读写队列:ConcurrentLinkedQueue

      


目录
相关文章
|
8天前
|
Java 开发者
Java多线程编程中的常见误区与最佳实践####
本文深入剖析了Java多线程编程中开发者常遇到的几个典型误区,如对`start()`与`run()`方法的混淆使用、忽视线程安全问题、错误处理未同步的共享变量等,并针对这些问题提出了具体的解决方案和最佳实践。通过实例代码对比,直观展示了正确与错误的实现方式,旨在帮助读者构建更加健壮、高效的多线程应用程序。 ####
|
22小时前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
123 82
|
7天前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
|
7天前
|
Java 开发者
Java多线程编程的艺术与实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的技术文档,本文以实战为导向,通过生动的实例和详尽的代码解析,引领读者领略多线程编程的魅力,掌握其在提升应用性能、优化资源利用方面的关键作用。无论你是Java初学者还是有一定经验的开发者,本文都将为你打开多线程编程的新视角。 ####
|
6天前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
12天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
37 9
|
9天前
|
安全 Java 开发者
Java多线程编程中的常见问题与解决方案
本文深入探讨了Java多线程编程中常见的问题,包括线程安全问题、死锁、竞态条件等,并提供了相应的解决策略。文章首先介绍了多线程的基础知识,随后详细分析了每个问题的产生原因和典型场景,最后提出了实用的解决方案,旨在帮助开发者提高多线程程序的稳定性和性能。
|
12天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
3月前
|
安全 Java 数据库
一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)
这篇文章是关于Java面试题的笔记,涵盖了线程池复用原理、Spring框架基础、AOP和IOC概念、Bean生命周期和作用域、单例Bean的线程安全性、Spring中使用的设计模式、以及Spring事务的实现方式和隔离级别等知识点。
|
2月前
|
存储 缓存 Java
JAVA并发编程系列(11)线程池底层原理架构剖析
本文详细解析了Java线程池的核心参数及其意义,包括核心线程数量(corePoolSize)、最大线程数量(maximumPoolSize)、线程空闲时间(keepAliveTime)、任务存储队列(workQueue)、线程工厂(threadFactory)及拒绝策略(handler)。此外,还介绍了四种常见的线程池:可缓存线程池(newCachedThreadPool)、定时调度线程池(newScheduledThreadPool)、单线程池(newSingleThreadExecutor)及固定长度线程池(newFixedThreadPool)。
下一篇
无影云桌面