加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

在java中使用线程进行并行处理

发布时间:2020-12-15 04:43:42 所属栏目:Java 来源:网络整理
导读:我需要在我的程序中同时运行几个函数.这些进程返回记录.但是,一个的输出是另一个的输入.在这种情况下,如果在一个时间点,函数A需要一些时间将一些记录输出到函数B,我需要函数B等待,直到函数A提供一些记录作为该过程的输入.我可以通过使用等待,连接等线程功能
我需要在我的程序中同时运行几个函数.这些进程返回记录.但是,一个的输出是另一个的输入.在这种情况下,如果在一个时间点,函数A需要一些时间将一些记录输出到函数B,我需要函数B等待,直到函数A提供一些记录作为该过程的输入.我可以通过使用等待,连接等线程功能来实现这一点.或者是否有任何其他方法来实现相同的功能.

编辑:
根据下面提到的建议,如果我使用生产者 – 消费者算法与BlockingQueue,ExecutorService,Future和CountDownLatch,我可以实现我要求的所有功能吗?

解决方法

如上所述,您可以使用阻塞队列与生产者使用者

要么

您可以使用java并发的倒计时锁存来解决您的问题.

CountDownLatch如何工作?

CountDownLatch.java类定义了一个构造函数:

//构造一个用给定计数初始化的CountDownLatch.

public void CountDownLatch(int count) {...}

这个计数本质上就是锁存器应该等待的线程数.此值只能设置一次,而CountDownLatch不提供其他机制来重置此计数.

与CountDownLatch的第一次交互是主线程,它是等待其他线程的goind.这个主线程必须在启动其他线程后立即调用CountDownLatch.await()方法.执行将在await()方法上停止,直到其他线程完成执行.

其他N个线程必须引用latch对象,因为它们需要通知CountDownLatch对象它们已经完成了它们的任务.此通知通过以下方法完成:CountDownLatch.countDown();每次调用方法都会减少构造函数中设置的初始计数,因此,当所有N个线程都调用此方法时,count会达到零,并允许主线程通过await()方法恢复执行.

下面是一个简单的例子.在Decrementer之后调用了countDown()3次

CountDownLatch,the waiting Waiter is released from the await() call.
CountDownLatch latch = new CountDownLatch(3);

Waiter      waiter      = new Waiter(latch);
Decrementer decrementer = new Decrementer(latch);

new Thread(waiter)     .start();
new Thread(decrementer).start();

Thread.sleep(4000);

public class Waiter implements Runnable{

    CountDownLatch latch = null;

    public Waiter(CountDownLatch latch) {
        this.latch = latch;
    }

    public void run() {
        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Waiter Released");
    }
}

public class Decrementer implements Runnable {

    CountDownLatch latch = null;

    public Decrementer(CountDownLatch latch) {
        this.latch = latch;
    }

    public void run() {

        try {
            Thread.sleep(1000);
            this.latch.countDown();

            Thread.sleep(1000);
            this.latch.countDown();

            Thread.sleep(1000);
            this.latch.countDown();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

在您的情况下,您可以使用callable来创建线程而不是runnable,因为您需要从一个线程获取retrun值并且必须将该值传递给第二个线程.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读