java.util.concurrent

本文深入探讨了Java 1.5版本引入的并发框架,包括ExecutorFramework、并发集合(如ConcurrentCollection)和同步器(Synchronizer)。详细介绍了Executor接口、ExecutorService工厂方法(如newCachedThreadPool和newFixedThreadPool)、并发集合的优势以及同步器的典型应用(如CountDownLatch)。通过示例程序展示了如何利用这些并发工具进行线程间的协调和同步。

在java1.5发行版本中,java平台新增了java.util.concurrent。

包括了三部分:Executor Framework、并发集合(Concurrent Collection)、以及同步器(Synchronizer)

1 Executor Framework

Executor 接口

public interface Executor {
    void execute(Runnable command);
}

之前操作线程都通过,Thread现在可以通过Executor 对象,此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方法。
并且同时java.util.concurrent.Executors中提供了一系列创建具有各种功能的Executor的工厂方法(不仅仅这些),也就是说大部分情况下我们可以不用自己实现,使用现成的Executor对象。

简单介绍两个java.util.concurrent.Executors中的工厂方法,
static ExecutorService newCachedThreadPool():创建缓存的线程池,如果当前没有线程可用,就创建一个新的线程
static ExecutorService newFixedThreadPool(int nThreads) :创建固定数目的线程池。

2 并发集合

内部同步的集合对象,与通常的集合对象功能相同,但是并发集合是同步的,在需要线程安全的条件下,优先使用并发集合。例如:ConcurrentMap的实现类ConcurrentHashMap

3 同步器
同步器是一些事线程能够等待另一个线程的对象,允许他们协调动作,
书上的例子使用的是CountDownLatch,简单介绍一下CountDownLatch(倒计数锁存器)是一次性的障碍,允许一个或者多个线程等待一个或者多个线程来做某些事情,CountDownLatch的唯一构造器上带有一个int类型的参数,这个int参数时指允许所有在等待的线程被处理之前,必须在锁存器上调用countDown方法的次数
示例程序:

public class CountDownLatchTest 
{   
    private static int concurrency = 10;

    private static int x = 0;

    private static synchronized int addX()
    {
        return x++;
    }

    public static void main(String[]args)  throws Exception
    {
        final CountDownLatch ready = new CountDownLatch(concurrency);
        final CountDownLatch start = new CountDownLatch(1);
        final CountDownLatch done = new CountDownLatch(concurrency);

        Executor executor = Executors.newFixedThreadPool(20);

        for(int i=0;i<concurrency;i++)
        {
            executor.execute(new Runnable(){
                private int order = 0;
                public void run(){
                    System.out.println((order=addX())+"号准备完毕");
                    ready.countDown();

                    try
                    {
                        start.await();
                        System.out.println(order+"号执行ing...完毕");
                    }
                    catch(InterruptedException e)
                    {
                        Thread.currentThread().interrupt();
                    }
                    finally
                    {
                        done.countDown();
                    }
                }
            });
        }

        ready.await();
        long startNaos = System.nanoTime();
        start.countDown();
        done.await();
        System.out.println("所有线程执行完毕");
        System.out.println(System.nanoTime() - startNaos);
    }
}

await()方法具有阻塞作用,countDown()方法没有阻塞作用。
执行过程:
子线程启动后,执行到start.await();会被阻塞,
主线程直接会被ready.await();阻塞,
当所有的子线程都执行过ready.countDown();以后,ready.countDown();执行次数已够,主线程的ready.await();阻塞打开。
主线程继续执行start.countDown();,start.await();阻塞被打开,所有子线程开始执行
主线程被done.await();阻塞,
当所有子线程执行完毕后,done.countDown();次数执行次数已够,主线程继续执行

达到效果就是:
当所有子线程都被阻塞在start.await();后
解除主线程的ready.await();阻塞
主线程执行start.countDown();,所有子线程同时执行,
在最后一个子线程执行done.countDown();后
解除主线程的done.await();阻塞

常用的同步器有CountDownLatch和Semaphore,较不常用的是CyclicBarrier和Exchanger。
CountDownLatch以外的,以后遇到再了解用法。

【顶级EI复现】计及连锁故障传播路径的电力系统 N-k 多阶段双层优化及故障场景筛选模型(Matlab代码实现)内容概要:本文介绍了名为《【顶级EI复现】计及连锁故障传播路径的电力系统 N-k 多阶段双层优化及故障场景筛选模型(Matlab代码实现)》的研究资源,重点围绕电力系统中连锁故障的传播机制,提出了一种N-k多阶段双层优化模型,并结合故障场景筛选方法提升系统安全性与鲁棒性。该模型通过Matlab代码实现,可用于模拟复杂电力系统在多重故障下的响应特性,支持对关键故障路径的识别与优化决策,适用于高水平科研复现与工程仿真分析。文中还列举了大量相关技术方向的配套资源,涵盖智能优化算法、电力系统管理、机器学习、路径规划等多个领域,并提供了网盘链接以便获取完整代码与资料。; 适合人群:具备电力系统、优化理论及Matlab编程基础的研究生、科研人员及从事能源系统安全分析的工程技术人员,尤其适合致力于高水平论文(如EI/SCI)复现与创新的研究者。; 使用场景及目标:①复现顶级期刊关于N-k故障与连锁传播的优化模型;②开展电力系统韧性评估、故障传播分析与多阶段防御策略设计;③结合YALMIP等工具进行双层优化建模与场景筛选算法开发;④支撑科研项目、学位论文或学术成果转化。; 阅读建议:建议读者按照文档提供的目录顺序系统学习,优先掌握双层优化与场景筛选的核心思想,结合网盘中的Matlab代码进行调试与实验,同时参考文中提及的智能算法与电力系统建模范例,深化对复杂电力系统建模与优化的理解。
java.util.concurrentJava 提供的一组类和接口,用于简化并发编程和多线程操作。它在 Java 5 中引入,并在后续版本中不断扩展,引入了许多高级工具和并发结构,使编写线程安全的代码变得更容易[^1]。 ### 基本组成部分 - **线程池(ExecutorService)**:是该包中非常重要的一部分,本质上是一个线程池,提供了线程的管理和复用机制,支持任务调度、线程同步、异常处理等功能,允许以更加灵活和高效的方式执行异步任务[^5]。 ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ExecutorServiceExample { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(2); executor.submit(() -> { System.out.println("Task 1 is running."); }); executor.submit(() -> { System.out.println("Task 2 is running."); }); executor.shutdown(); } } ``` - **阻塞队列(BlockingQueue)**:在异步场景中非常有用,例如在生产者 - 消费者模式中,它可以实现线程间的数据传递和同步[^3]。 ```java import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; public class BlockingQueueExample { public static void main(String[] args) { BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(10); // 生产者线程 Thread producer = new Thread(() -> { try { for (int i = 0; i < 5; i++) { queue.put(i); System.out.println("Produced: " + i); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } }); // 消费者线程 Thread consumer = new Thread(() -> { try { for (int i = 0; i < 5; i++) { Integer item = queue.take(); System.out.println("Consumed: " + item); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } }); producer.start(); consumer.start(); } } ``` ### 异常处理 在使用该包提供的工具时,可能会遇到各种各样的异常,如 `java.util.concurrent.ExecutionException` 和 `java.util.concurrent.CompletionException`。对于 `ExecutionException` 需要分析其背景、可能的原因等;对于 `CompletionException`,可通过检查异步任务本身的逻辑和异常情况、审查 `CompletableFuture` 的使用是否正确等步骤来解决[^2][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值