Java并发——Phaser详解

Java8 Phaser 源码解析 目录 一、使用 1、基本概念 2、实现CountDownLatch的效果 3、实现CyclicBarrier的效果 4、灵活调整parties 5、onAdvance 6、父子Phaser 二、源码解析 1、定义 2、构造方法 3、register /bulkRegister 4、arrive /arriveAndDeregister /arriveAndAwai... 阅读详情

Phaser

Phaser中文翻译为相位器。它与CountDownLatch非常相似,允许我们协调线程的执行。与CountDownLatch相比,它具有一些额外的功能。

Phaser是在线程动态数需要继续执行之前等待的屏障。在CountDownLatch中,该数字无法动态配置,需要在创建实例时提供。
在这里插入图片描述

arriveAndAwaitAdvanve()方法:
方arriveAndAwaitAdvanceo的作用与 CountDownLatch类中的awai()方法大体一样,通过从方法的名称解释来看, arrive是到达的意思,wait是等待的意思,而 advance是前进、促进的意思,所以执行这个方法的作用就是当前线程已经到达屏障,在此等待一段时间,等条件满足后继续向下一个屏障继续执行。

public class PrintTools {
    public static Phaser phaser;

    public static void methodA() {
        System.out.println(Thread.currentThread().getName() + " A1 begin=" + System.currentTimeMillis());
        phaser.arriveAndAwaitAdvance();
        System.out.println(Thread.currentThread().getName() + " A1 end=" + System.currentTimeMillis());

        System.out.println(Thread.currentThread().getName() + " A2 begin=" + System.currentTimeMillis());
        phaser.arriveAndAwaitAdvance();
        System.out.println(Thread.currentThread().getName() + " A2 end=" + System.currentTimeMillis());
    }

    public static void methodB() {
        try {
            System.out.println(Thread.currentThread().getName() + " A1 begin=" + System.currentTimeMillis());
            phaser.arriveAndAwaitAdvance();
            System.out.println(Thread.currentThread().getName() + " A1 end=" + System.currentTimeMillis());

            System.out.println(Thread.currentThread().getName() + " A2 begin=" + System.currentTimeMillis());
            Thread.sleep(5000);
            phaser.arriveAndAwaitAdvance();
            System.out.println(Thread.currentThread().getName() + " A2 end=" + System.currentTimeMillis());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Phaser p = new Phaser(3);
        PrintTools.phaser = p;

        ThreadA a = new ThreadA(phaser);
        a.setName("A");
        a.start();

        ThreadB b = new ThreadB(phaser);
        b.setName("B");
        b.start();

        ThreadC c = new ThreadC(phaser);
        c.setName("C");
        c.start();
    }
}
public class ThreadA extends Thread {
    private Phaser phaser;

    public ThreadA(Phaser phaser) {
        this.phaser = phaser;
    }

    @Override
    public void run() {
        PrintTools.methodA();
    }
}
public class ThreadB extends Thread {
    private Phaser phaser;

    public ThreadB(Phaser phaser) {
        this.phaser = phaser;
    }

    @Override
    public void run() {
        PrintTools.methodA();
    }
}
public class ThreadC extends Thread {
    private Phaser phaser;

    public ThreadC(Phaser phaser) {
        this.phaser = phaser;
    }

    @Override
    public void run() {
        PrintTools.methodB();
    }
}

在这里插入图片描述
注意:当arriveAndAwaitAdvance()调用时,如果计数不足,则线层呈阻塞状态,不继续向下运行
修改methodB()方法
在这里插入图片描述
再次运行,输出如下:
在这里插入图片描述

arriveAndDeregister()方法:
当线程到达屏障后,退出屏障的阻塞,并且使parties值减一。

public class Deregister {
    public static void main(String[] args) {
        Phaser phaser = new Phaser(2);
        MyThread t = new MyThread(phaser);
        t.start();
        System.out.println("main begin" + System.currentTimeMillis());
        System.out.println(phaser.getRegisteredParties());
        phaser.arriveAndDeregister();//退出阻塞,计数-1
        System.out.println(phaser.getRegisteredParties());
        System.out.println("main end" + System.currentTimeMillis());
    }
}

class MyThread extends Thread{
    private Phaser phaser;

    public MyThread(Phaser phaser) {
        this.phaser = phaser;
    }

    @Override
    public void run() {
        phaser.arriveAndAwaitAdvance();
        System.out.println("MyThread end");
    }
}

在这里插入图片描述

getPhase()和onAdvance():

方法getPhase()获取的是已经到达第几个屏障。

public class getPhase {

    public static void main(String[] args) throws InterruptedException {
        Phaser phaser = new Phaser(1);
        TestThread t = new TestThread(phaser);
        t.start();
    }


}
class TestThread extends Thread {
    private Phaser phaser;

    public TestThread(Phaser phaser) {
        this.phaser = phaser;
    }

    @Override
    public void run() {
        System.out.println("A begin");
        phaser.arriveAndAwaitAdvance();
        System.out.println("A end phase value=" + phaser.getPhase());

        System.out.println("A begin");
        phaser.arriveAndAwaitAdvance();
        System.out.println("A end phase value=" + phaser.getPhase());

        System.out.println("A begin");
        phaser.arriveAndAwaitAdvance();
        System.out.println("A end phase value=" + phaser.getPhase());
    }
}

在这里插入图片描述

onAdvance()的作用是通过新的屏障时被调用:

public class onAdvance {
    public static void main(String[] args) throws InterruptedException {
        Phaser phaser = new Phaser(2) {
            @Override
            protected boolean onAdvance(int phase, int registeredParties) {
                System.out.println("onAdvence被调用!");
                return true;
                //返回true表示,下一次到达屏障不等待了,Phaser呈无效/销毁的状态
                //返回false表示,下一次到达屏障Phaser继续工作
            }
        };

        //第一次通过屏障
        AThread a = new AThread(phaser);
        a.start();
        phaser.arriveAndAwaitAdvance();


        //第二次
        Thread.sleep(2000);
        BThread b = new BThread(phaser);
        b.start();
        System.out.println("main end");
    }
}

class AThread extends Thread {
    private Phaser phaser;

    public AThread(Phaser phaser) {
        this.phaser = phaser;
    }

    @Override
    public void run() {
        System.out.println("A begin");
        phaser.arriveAndAwaitAdvance();
        System.out.println("A end");
    }
}

class BThread extends Thread {
    private Phaser phaser;

    public BThread(Phaser phaser) {
        this.phaser = phaser;
    }

    @Override
    public void run() {
        System.out.println("B begin");
        phaser.arriveAndAwaitAdvance();
        System.out.println("B end");
    }
}

onAdvance返回true,下一次到达屏障不阻塞
在这里插入图片描述

修改返回值为false,下一次到达屏障正常阻塞
在这里插入图片描述

getRegisteredParities():
获得注册的parties数量。

register():
每执行一次方法,就动态添加一个parties值。

bulkRegister():
批量增加parties数量。

getArrivedParties():
获得已经被使用的parties个数。

getUnarrivedParties():
获得未被使用的parties个数。

public class Parties {
    public static void main(String[] args) {
        Phaser phaser = new Phaser(5);
        System.out.println(phaser.getRegisteredParties());//5

        phaser.register();
        System.out.println(phaser.getRegisteredParties());//6

        phaser.bulkRegister(10);
        System.out.println(phaser.getRegisteredParties());//16

        System.out.println(phaser.getArrivedParties());//0
        System.out.println(phaser.getUnarrivedParties());//16
    }
}

arrive()方法:
方法arrive()的作用是使parties 值加1,并且不在屏障处等待,直接向下面的代码继续运行,并且Phaser类有计数重置功能。

public class TestArrive {
    public static void main(String[] args) {
        Phaser phaser = new Phaser(2){
            @Override
            protected boolean onAdvance(int phase, int registeredParties) {
                System.out.println("到达屏障,但未通过!phase=" + phase + " registeredParties=" + registeredParties);
                return super.onAdvance(phase, registeredParties);
            }
        };

        System.out.println("A1 getPhase=" + phaser.getPhase() + " getRegisteredParties=" + phaser.getRegisteredParties() +
                " getArrivedParties=" + phaser.getArrivedParties());
        phaser.arrive();
        System.out.println("A1 getPhase=" + phaser.getPhase() + " getRegisteredParties=" + phaser.getRegisteredParties() +
                " getArrivedParties=" + phaser.getArrivedParties());

        System.out.println("A2 getPhase=" + phaser.getPhase() + " getRegisteredParties=" + phaser.getRegisteredParties() +
                " getArrivedParties=" + phaser.getArrivedParties());
        phaser.arrive();
        System.out.println("A2 getPhase=" + phaser.getPhase() + " getRegisteredParties=" + phaser.getRegisteredParties() +
                " getArrivedParties=" + phaser.getArrivedParties());

        System.out.println("B1 getPhase=" + phaser.getPhase() + " getRegisteredParties=" + phaser.getRegisteredParties() +
                " getArrivedParties=" + phaser.getArrivedParties());
        phaser.arrive();
        System.out.println("B1 getPhase=" + phaser.getPhase() + " getRegisteredParties=" + phaser.getRegisteredParties() +
                " getArrivedParties=" + phaser.getArrivedParties());

        System.out.println("B2 getPhase=" + phaser.getPhase() + " getRegisteredParties=" + phaser.getRegisteredParties() +
                " getArrivedParties=" + phaser.getArrivedParties());
        phaser.arrive();
        System.out.println("B2 getPhase=" + phaser.getPhase() + " getRegisteredParties=" + phaser.getRegisteredParties() +
                " getArrivedParties=" + phaser.getArrivedParties());
    }
}

在这里插入图片描述
方法arrive()的功能是使getArrivedParties()计数加1,不等待其他线程到达屏障。
在控制台中多次出现getArrivedParties=0的运行结果,所以可以分析出Phaser类在经过屏障点后计数能被重置。

awaitAdvance(int phase):
如果传人参数phase值和当前getPhase()方法返回值一样,则在屏障处等待,否则继续向下面运行,有些类似于旁观者的作用,当观察的条件满足了就等待(旁观),如果条件不满足,则程序向下继续运行。

public class AwaitAdvance {
    public static void main(String[] args) {
        Phaser phaser = new Phaser(1);
        phaser.awaitAdvance(1);//不一样,通过
        System.out.println("通过第一次");

        phaser.arriveAndAwaitAdvance();
        phaser.awaitAdvance(1);//一样,阻塞
        System.out.println("通过第二次");
    }
}

在这里插入图片描述

awaitAdvanceInterruptibly(int):
可中断的。
awaitAdvanceInterruptibly(int ,long, TImeUnit):
带超时,且可中断。

forceTermination()和isTerminated():
方法forceTermination()使Phaser对象的屏障功能失效,而方法isTerminated()是判断Phaser对象是否已经呈销毁状态。

public class Termination {
    public static void main(String[] args) {
        Phaser phaser = new Phaser(2);
        phaser.forceTermination();
        phaser.arriveAndAwaitAdvance();//失效,所以不阻塞
        System.out.println(phaser.isTerminated());//true
    }
}
控制Phaser类的运行时机

前面的示例都是线程一起到达屏障后继续运行,有些情况下是需要进行控制的,也就是到达屏障后不允许继续运行。
默认的运行效果:

public class RunDemo {
    public static void main(String[] args) {
        Phaser phaser = new Phaser(3);
        for (int i = 0; i < 3; i++) {
            RunThread t = new RunThread(phaser);
            t.start();
        }
    }
}

class RunThread extends Thread {
    private Phaser phaser;

    public RunThread(Phaser phaser) {
        this.phaser = phaser;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " A1 begin=" + System.currentTimeMillis());
        phaser.arriveAndAwaitAdvance();
        System.out.println(Thread.currentThread().getName() + " A1 end=" + System.currentTimeMillis());
    }
}

在这里插入图片描述

可控的运行时机:

public static void main(String[] args) throws InterruptedException {
        Phaser phaser = new Phaser(3);
        phaser.register();
        for (int i = 0; i < 3; i++) {
            RunThread t = new RunThread(phaser);
            t.start();
        }
        Thread.sleep(2000);
        phaser.arriveAndAwaitAdvance();
    }

在这里插入图片描述
此实验说明运行的时机是可以通过逻辑控制的,主要的原理就是计数+1,然后通过逻辑代码的方式来决定线程是否继续向下运行。

Java并发编程:深入理解Phaser的灵活应用 Phaser在Java并发编程中提供了非常灵活的同步机制,适用于需要在多个阶段进行同步的场景。通过动态注册和注销线程,以及在阶段变化时执行操作,Phaser能够满足复杂的并发需求。希望本文的示例能够帮助你更好地理解和使用Phaser。 阅读详情

相关推荐

JAVA并发编程进阶​ Fork/Join框架、Phaser类详解

Java并发编程提供了两种处理并行任务的重要工具:Fork/Join框架适用于分治计算场景,通过任务分解、并行执行和结果合并提高效率;Phaser类则用于多阶段任务协调,确保线程按阶段同步执行。本文详细解析了两者的核心机制、实现方式及典型应用场景,并通过数组求和、多阶段数据处理等示例展示其使用方法。文章还对比了两者的特性差异,并给出任务分解粒度、线程池选择等最佳实践建议,帮助开发者根据实际需求选择合适的并发工具。

zjw541806的博客 137

Java多线程---Phaser

Phaser是Java7新引入的并发API,我们可以将Phaser的概念看成是一个个的阶段, 每个阶段都需要执行的线程任务,任务执行完毕后就进入下一阶段。这里和CyclicBarrier 和CountDownLatch的概念类似, 实际上也确实可以用Phaser代替CyclicBarrier和CountDownLatch。 Phaser也是通过计数器来控制, 在Phaser中叫parties, 我们在指定了parties之后, Phaser可以根据需要动态增加或减少parties的值。 Phaser常用

zhoushimiao1990的博客 3809

【一线大厂Java面试题合集】第27篇-JUC并发工具类详解

Phaser 是 JDK 7 引入的更灵活的同步屏障工具,可以看作是 CountDownLatch 和 CyclicBarrier 的增强版。动态注册:运行时动态增加/减少参与方数量多阶段同步:支持多个阶段(phase)的协调,每个阶段可以有不同的参与者分层结构:支持 Phaser 树状分层,减少竞争可自定义行为:通过重写来自定义阶段到达时的行为工具类核心作用底层实现可复用典型场景等待 N 个事件完成AQS 共享模式否服务启动等待初始化N 个线程互相等待是多线程分阶段计算。

gaochufukanyongren的博客 24

Java 多线程之 Phaser(多阶段任务/同步辅助类)

Phaser 也是Java并发编程中的一种同步辅助工具,用于线程之间的协调和同步。它提供了比和更灵活和强大的功能,可以用于更复杂的多线程协作场景。Phaser的主要用途是将多个线程分为多个阶段,并在每个阶段进行同步。每个线程可以独立运行,但在特定的阶段需要等待其他线程到达屏障点。Phaser可以动态地适应线程的注册和注销,可以处理可变数量的参与者。多阶段任务:Phaser 可以用于将一个任务分解为多个阶段,每个阶段由多个线程并行执行,等待所有线程完成当前阶段后再进入下一个阶段。

QIFU的专栏 1690

java多线程之Phaser的使用详解

主要介绍了java多线程之Phaser的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

告别理论!手把手教你用Patran/Nastran搞定悬臂翼的颤振分析(附完整模型文件)

本文提供了一份详细的Patran/Nastran悬臂翼颤振分析实战指南,涵盖从几何建模到结果解读的全过程。通过手把手教学和完整模型文件,帮助工程师和学生快速掌握气动弹性分析技术,特别适合需要实际操作的初学者。文章重点介绍了模态分析、气动建模和颤振求解等关键步骤,并提供了常见问题排查和优化建议。

weixin_30879169的博客 492

Java并发神器Phaser:动态同步屏障详解

Phaser是一个支持动态参与者数量、可重用、可分层、带阶段编号的高级同步屏障,适用于复杂、多阶段、参与者数量变化的并发协调场景。如果你有具体使用场景(比如“我想让1000个线程分10批执行”),我可以给出代码示例!

m0_37607945的博客 909

西门子TM PosInput1模块SSI编码器配置与速度测量实战

本文详细介绍了西门子TM PosInput1模块配置SSI绝对值编码器的实战步骤,涵盖硬件组态、工艺对象配置、编程实现与速度测量优化。重点解析了高分辨率编码器的数值处理技巧和常见调试问题,帮助工程师快速实现高精度位置与速度检测,提升自动化项目效率。

emacs5lisp的博客 339

beaninfo详解源码解析 java_java 高并发进阶 Phaser 相位器源码详解

Phaser简介可重用的同步屏障,其功能类似于CyclicBarrier和CountDownLatch,但支持更灵活的用法。这个工具类我们暂时就翻译为:移相器/相位器使用入门我们来看一个简单的例子。假设我们有一个比赛,有多位玩家参加。当所有玩家完成第一次比赛,我们认为上半场游戏结束;全部参加完第二次比赛,认为下半场游戏结束。这个要如何实现呢?自定义 Phaser 类publicclassMyP...

weixin_39992417的博客 205

生信物种注释软件Kraken2+Bracken的安装与使用

一、软件安装与数据库下载 1.Kraken2安装 Kraken2是一个基于k-mer算法的高精度宏基因组序列分类软件,能够快速的将测序reads进行物种分类。 使用conda一键安装,要先安装好anaconda或者miniconda conda install -y kraken2 输入krakek2 --help 出现如下所示帮助文档,则表示安装成功。 2.Bracken安装 bracken是一种从宏基因组数据中高度准确的计算物种丰度的统计方法。 同样使用conda一键安装 conda install -

jileiqwd的博客 1万+

STM32_DAC

DAC(Digital-to-Analog Converter,数模转换器)是将数字信号转换为模拟信号的外设,广泛应用于音频输出、波形生成、电机控制等场景。STM32F407 系列芯片配备了 2 个 DAC 通道(DAC1 和 DAC2),支持 12 位分辨率,支持多种触发方式,可输出稳定的模拟电压。本文从 DAC 的基本原理出发,详细讲解 STM32F407 DAC 的配置方法、代码实现、波形生成以及实际应用案例,帮助你快速掌握 DAC 的使用技巧。

轩宇的博客 1239

Java 锁相关详解【七、Java 并发工具类全景图:Semaphore、CountDownLatch、CyclicBarrier 与 Phaser】

本文全面解析了Java四大并发工具类:Semaphore用于控制资源访问数量(如限流);CountDownLatch用于等待一组线程完成(一次性);CyclicBarrier实现线程同步执行(可重用);Phaser支持分阶段动态同步(复杂任务)。四者各具特色:Semaphore基于许可控制并发,CountDownLatch采用倒计时机制,CyclicBarrier通过屏障同步,Phaser提供多阶段灵活性。文章通过代码示例展示了它们的典型应用场景,并对比了核心特性和适用场景,建议开发者根据具体需求选择合适工

NeoLshu的博客 754

常见信号逻辑电平标准介绍:TTL、CMOS、ECL、LVDS、CML

逻辑电平是指数字信号电压的高、低电平,相关参数定义如下:(1)输入高电平门限Vih:保证逻辑门的输入为高电平时所允许的最小输入高电平,当输入电平高于Vih时,则认为输入电平为高电平;(2)输入低电平门限Vil:保证逻辑门的输入为低电平时所允许的最大输入低电平,当输入电平低于Vil时,则认为输入电平为低电平;(3)输出高电平门限Voh:保证逻辑门的输出为高电平时的输出电平的最小值,逻辑门的输出为高电平时的电平值都必须大于此Voh;

liuchj的博客 1万+

Java并发编程-Phaser解析

在并发编程中,协调多个线程之间的执行顺序是一个常见的需求。Java 提供了多种工具来处理线程同步问题,如和Semaphore。然而,这些工具在某些复杂的场景中显得有些笨拙或受限。为了提供一种更灵活、更强大的阶段性同步机制,Java 并发包引入了Phaser类。Phaser是 Java 7 引入的一个高级同步工具,它允许一组线程在多个阶段上进行同步,而不是像那样只在一个点上进行同步。这使得Phaser在处理多阶段并发任务时特别有用,尤其是在动态调整参与线程数量的情况下。通过Phaser。

WenZhang的博客 1181

牛顿法vs高斯牛顿法vs LM算法:三行代码说清核心区别(附性能对比表格)

本文通过对比牛顿法、高斯牛顿法和LM算法的核心迭代代码,揭示了三者在非线性最小二乘优化中的本质区别。LM算法通过引入阻尼因子,在高斯牛顿法的快速收敛与梯度下降的稳定性之间取得平衡,成为工程实践中鲁棒性最强的首选。文章还提供了清晰的性能对比表格,帮助开发者根据初始估计和问题性质快速选择合适算法。

weixin_29062255的博客 419

实战解析:如何用Python逆向破解FastMoss的TikTok数据加密签名(附完整代码)

本文详细解析了如何用Python逆向破解FastMoss平台的TikTok数据加密签名机制,包括MD5加密算法和JS逆向分析。通过完整的Python代码示例,帮助开发者理解签名生成原理并实现自动化请求,提升数据获取能力。

weixin_30955617的博客 556

掌握 Java 并发包中的 Phaser 同步工具

Phaser(阶段器)是一个可复用的同步工具,它允许一组线程在执行过程中进行分阶段同步。每个阶段都有唯一的编号(从 0 开始),线程可以在阶段末尾等待其他线程,直到所有线程都到达该阶段后,Phaser才会推进到下一阶段。其核心逻辑基于register()(注册线程)、arrive()(线程到达)和(等待阶段推进)等方法实现。Phaser作为 Java 并发包中的高级同步工具,以其灵活的阶段控制和动态线程管理能力,为复杂并发场景提供了高效的解决方案。通过掌握Phaser。

潜意识Java的博客 811

PowerPMAC配置EtherCAT设备

本文详细介绍了在PowerPMAC IDE环境下配置EtherCAT伺服电机的完整流程。主要内容包括:准备工作(连接硬件和获取ESI文件)、通过ESI管理器加载配置文件、网络扫描识别从站设备、变量映射(定义输入输出位置参数)、激活EtherCAT通讯(验证状态字和实际位置)以及相关参数说明。文章还概述了主站配置的8个方面和从站配置的7个选项,重点说明了PDO映射和变量分配机制,为伺服电机的EtherCAT通信配置提供了系统指导。

mahuliang321的博客 966

JUC工具类: Phaser

Phaser:JUC包下的一个同步工具,在功能上跟CyclicBarrier和CountDownLatch差不多,但支持更丰富的用法,它支持对任务的动态调整,并支持分层结构来达到更高的吞吐量。可以协调多个线程在多个阶段上同步,在所有分组中的线程都执行完当前阶段之后,Phaser会自动进入下一个阶段。与JUC中多数同步类不同,它并不是通过AQS来实现的,而是用了另外一种同步机制。本文我们将从多个方面分析Phaser这个同步类。

埃泽漫笔 799

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java并发控制:Phaser深度解析

在当今的软件开发领域,高并发已经成为一个不可忽视的关键问题。尤其是在处理大量用户请求或进行大规模数据处理时,如何有效地管理并发任务,确保系统的稳定性和性能,成为了开发人员必须面对的挑战。Java作为一门广泛应用于企业级应用开发的语言,提供了多种并发控制工具。其中,Phaser作为一种高级同步工具,在Java并发编程中扮演着重要角色。Phaser能够帮助我们更好地理解和控制并发执行流程,提高程序的执行效率。

JavaCodePro的博客 966

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Phaser详解

Java并发包中的Phaser是一种灵活的多阶段同步屏障,支持线程的动态注册/注销和分阶段协调机制。其核心特性包括动态参与方管理、多阶段协调和层次化等待,适用于迭代算法、流水线处理等场景。Phaser内部通过状态变量(phase/parties/unarrived)和队列节点管理同步状态,提供awaitAdvance()等关键方法实现阶段同步。典型应用场景包括并行矩阵运算、视频编码流水线和分布式任务调度。最佳实践建议采用弹性线程池集成实现动态参与方管理,自定义onAdvance()方法控制阶段终止条件,并使

csdn_tom_168的博客 1202

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

phaser java_Java 7的并发编程-Phaser

Java 7的并发包中推出了Phaser,其功能跟CyclicBarrier和CountDownLatch有些重叠,但是提供了更灵活的用法,例如支持动态调整注册任务的数量等。本文在Phaser自带的示例代码基础上进行一下简单的分析。注册(Registration)Phaser支持通过register()和bulkRegister(int parties)方法来动态调整注册任务的数量,此外也支持通过...

weixin_40008033的博客 180

java并发包之Phaser的arriveAndAwaitAdvance方法用法实例

java并发包之Phaser的arriveAndAwaitAdvance方法用法实例演示,秒懂 解决方法: 1.线程类 package com.wlg; import java.util.concurrent.Phaser; public class MyThread extends Thread { public Phaser phaserser; public MyThread( Phaser phaserser) { this.phaser...

qq_30908729的博客 523
上一篇: Java并发——Exchanger
下一篇: Java并发——ThreadPoolExecutor详解(一)
吴声子夜歌
博客等级 码龄9年 2687粉丝 2261原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值