Java线程等待值

Java线程等待值,第1张

Java线程等待

创建一些共享存储来保存

x
每个线程的值,或者如果足够的话,只存储总和。使用a
CountDownLatch
等待线程终止。每个线程完成后都会调用
CountDownLatch.countDown()
,您的
myAlgorithm
方法将使用该
CountDownLatch.await()
方法来等待它们。

编辑: 这是我建议的方法的完整示例。它创建了39个工作线程,每个工作线程都将一个随机数添加到一个共享总数中。当所有工人都完成后,将计算并打印平均值。

import java.util.Random;import java.util.concurrent.CountDownLatch;import java.util.concurrent.atomic.AtomicInteger;class Worker implements Runnable {    private final AtomicInteger sum;    private final CountDownLatch latch;    public Worker(AtomicInteger sum, CountDownLatch latch) {        this.sum = sum;        this.latch = latch;    }    @Override    public void run() {        Random random = new Random();        try { // Sleep a random length of time from 5-10s Thread.sleep(random.nextInt(5000) + 5000);        } catch (InterruptedException e) { e.printStackTrace();        }        // Compute x        int x = random.nextInt(500);        // Add to the shared sum        System.out.println("Adding " + x + " to sum");        sum.addAndGet(x);        // This runnable is finished, so count down        latch.countDown();    }}class Program {    public static void main(String[] args) {        // There will be 39 workers        final int N = 39;        // Holds the sum of all results from all workers        AtomicInteger sum = new AtomicInteger();        // Tracks how many workers are still working        CountDownLatch latch = new CountDownLatch(N);        System.out.println("Starting " + N + " workers");        for (int i = 0; i < N; i++) { // Each worker uses the shared atomic sum and countdown latch. Worker worker = new Worker(sum, latch); // Start the worker new Thread(worker).start();        }        try { // important: waits for all workers to finish. latch.await();        } catch (InterruptedException e) { e.printStackTrace();        }        // Compute the average        double average = (double) sum.get() / (double) N;        System.out.println("    Sum: " + sum.get());        System.out.println("Workers: " + N);        System.out.println("Average: " + average);    }}

输出应该是这样的:

Starting 39 workersAdding 94 to sumAdding 86 to sumAdding 454 to sum.........Adding 358 to sumAdding 134 to sumAdding 482 to sum    Sum: 10133Workers: 39Average: 259.8205128205128

编辑:
只是为了好玩,这里是用一个例子

ExecutorService
Callable
Future

import java.util.ArrayList;import java.util.Collection;import java.util.List;import java.util.Random;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Future;import java.util.concurrent.ScheduledThreadPoolExecutor;class Worker implements Callable<Integer> {    @Override    public Integer call() throws Exception {        Random random = new Random();        // Sleep a random length of time, from 5-10s        Thread.sleep(random.nextInt(5000) + 5000);        // Compute x        int x = random.nextInt(500);        System.out.println("Computed " + x);        return x;    }}public class Program {    public static void main(String[] args) {        // Thread pool size        final int POOL_SIZE = 10;        // There will be 39 workers        final int N = 39;        System.out.println("Starting " + N + " workers");        // Create the workers        Collection<Callable<Integer>> workers = new ArrayList<Callable<Integer>>(N);        for (int i = 0; i < N; i++) { workers.add(new Worker());        }        // Create the executor service        ExecutorService executor = new ScheduledThreadPoolExecutor(POOL_SIZE);        // Execute all the workers, wait for the results        List<Future<Integer>> results = null;        try { // Executes all tasks and waits for them to finish results = executor.invokeAll(workers);        } catch (InterruptedException e) { e.printStackTrace(); return;        }        // Compute the sum from the results        int sum = 0;        for (Future<Integer> future : results) { try {     sum += future.get(); } catch (InterruptedException e) {     e.printStackTrace(); return; } catch (ExecutionException e) {     e.printStackTrace(); return; }        }        // Compute the average        double average = (double) sum / (double) N;        System.out.println("         Sum: " + sum);        System.out.println("     Workers: " + N);        System.out.println("     Average: " + average);    }}

输出应如下所示:

Starting 39 workersComputed 419Computed 36Computed 338.........Computed 261Computed 354Computed 112         Sum: 9526     Workers: 39     Average: 244.25641025641025


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5587352.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存