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

      


目录
相关文章
|
3天前
|
Java 流计算
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
12 1
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
|
2天前
|
监控 Java Linux
Java 性能调优:调整 GC 线程以获得最佳结果
Java 性能调优:调整 GC 线程以获得最佳结果
26 11
|
5天前
|
Java 调度
Java一个线程的生命周期详解
Java中,一个线程的生命周期分为五个阶段:NEW(新建),RUNNABLE(可运行),BLOCKED(阻塞),WAITING(等待),TERMINATED(终止)。线程创建后处于新建状态,调用start方法进入可运行状态,执行中可能因等待资源进入阻塞或等待状态,正常完成或异常终止后进入终止状态。各状态间可相互转换,构成线程的生命周期。
|
5天前
|
Java API 调度
Java 多线程编程详解
《Java多线程编程详解》深入浅出地讲解了Java平台下的多线程核心概念、API使用及最佳实践。从基础理论到实战案例,本书帮助读者掌握并发编程技巧,提升软件开发中的效率与性能,是Java开发者不可或缺的参考指南。
|
1天前
|
Java 数据处理 数据库
Java多线程的理解和应用场景
Java多线程的理解和应用场景
8 1
|
2天前
|
安全 Java 开发者
在多线程编程中,确保数据一致性与防止竞态条件至关重要。Java提供了多种线程同步机制
【10月更文挑战第3天】在多线程编程中,确保数据一致性与防止竞态条件至关重要。Java提供了多种线程同步机制,如`synchronized`关键字、`Lock`接口及其实现类(如`ReentrantLock`),还有原子变量(如`AtomicInteger`)。这些工具可以帮助开发者避免数据不一致、死锁和活锁等问题。通过合理选择和使用这些机制,可以有效管理并发,确保程序稳定运行。例如,`synchronized`可确保同一时间只有一个线程访问共享资源;`Lock`提供更灵活的锁定方式;原子变量则利用硬件指令实现无锁操作。
9 2
|
4天前
|
安全 Java 调度
理解 Java 中的多线程编程
本文深入探讨了Java中的多线程编程,涵盖线程创建与管理、同步机制、锁及死锁避免策略。介绍了通过继承`Thread`类或实现`Runnable`接口创建线程的方法,并讨论了线程的生命周期状态。此外,还讲解了如何使用`ExecutorService`线程池以及`java.util.concurrent`包中的工具类来简化并发编程。理解这些概念和技术,有助于开发高效稳定的多线程应用程序。
|
5天前
|
Java 开发者
农行1面:Java如何保证线程T1,T2,T3 顺序执行?
本文探讨了如何保证线程T1、T2、T3的顺序执行,这是农行面试中的一道题目,旨在考察候选人对多线程基础、同步机制、线程间通信及Java并发包的掌握情况。文章详细介绍了六种方法:`join()`、`CountDownLatch`、`Semaphore`、单线程池、`synchronized` 和 `CompletableFuture`,并通过示例代码展示了每种方法的具体实现。这些方法不仅适用于面试备考,还能帮助开发者更好地理解和掌握线程同步技术。
23 2
|
2月前
|
安全 Java 调度
解锁Java并发编程高阶技能:深入剖析无锁CAS机制、揭秘魔法类Unsafe、精通原子包Atomic,打造高效并发应用
【8月更文挑战第4天】在Java并发编程中,无锁编程以高性能和低延迟应对高并发挑战。核心在于无锁CAS(Compare-And-Swap)机制,它基于硬件支持,确保原子性更新;Unsafe类提供底层内存操作,实现CAS;原子包java.util.concurrent.atomic封装了CAS操作,简化并发编程。通过`AtomicInteger`示例,展现了线程安全的自增操作,突显了这些技术在构建高效并发程序中的关键作用。
62 1
|
22天前
|
Java API 容器
JAVA并发编程系列(10)Condition条件队列-并发协作者
本文通过一线大厂面试真题,模拟消费者-生产者的场景,通过简洁的代码演示,帮助读者快速理解并复用。文章还详细解释了Condition与Object.wait()、notify()的区别,并探讨了Condition的核心原理及其实现机制。