gpt4 book ai didi

java - 使用不同的唯一 id 提高每个线程的性能

转载 作者:行者123 更新时间:2023-12-01 19:04:16 24 4
gpt4 key购买 nike

问题陈述是:-

每个线程使用 1 到 1000 之间的唯一 ID,并且程序必须运行 60 分钟或更长时间,因此在这 60 分钟内,所有 ID 可能都会完成,因此我需要再次重用这些 ID,

我知道有几种方法可以做到这一点,其中一种方法是我在 StackOverflow 的帮助下编写的下面的方法,但是当我尝试运行这个程序时,我发现,运行几分钟后这个程序变得非常慢并且它在控制台上打印 ID 需要花费大量时间。有时我也会遇到内存不足错误。有没有更好的方法来解决此类问题?

class IdPool {
private final LinkedList<Integer> availableExistingIds = new LinkedList<Integer>();

public IdPool() {
for (int i = 1; i <= 1000; i++) {
availableExistingIds.add(i);
}
}

public synchronized Integer getExistingId() {
return availableExistingIds.removeFirst();
}

public synchronized void releaseExistingId(Integer id) {
availableExistingIds.add(id);
}
}


class ThreadNewTask implements Runnable {
private IdPool idPool;

public ThreadNewTask(IdPool idPool) {
this.idPool = idPool;
}

public void run() {
Integer id = idPool.getExistingId();
someMethod(id);
idPool.releaseExistingId(id);
}

private void someMethod(Integer id) {
System.out.println("Task: " +id);
}
}

public class TestingPool {
public static void main(String[] args) throws InterruptedException {
int size = 10;
int durationOfRun = 60;
IdPool idPool = new IdPool();
// create thread pool with given size
// create thread pool with given size
ExecutorService service = new ThreadPoolExecutor(size, size, 500L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10), new ThreadPoolExecutor.CallerRunsPolicy());


// queue some tasks
long startTime = System.currentTimeMillis();
long endTime = startTime + (durationOfRun * 60 * 1000L);

// Running it for 60 minutes
while(System.currentTimeMillis() <= endTime) {
service.submit(new ThreadNewTask(idPool));
}

// wait for termination
service.shutdown();
service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
}
}

最佳答案

我已经在上一个问题中向您解释过,您的代码向执行器提交了数以百万计的任务,因为它在 60 分钟内循环提交任务,而无需等待。

目前还不清楚您的最终目标是什么,但就目前情况而言,您正在填充任务队列,直到不再有任何可用内存为止。由于你没有解释你的程序的目标,所以很难给你任何解决方案。

但是您可以做的第一件事是限制执行器的任务队列的大小。这将迫使主线程在每次队列已满时阻塞。

关于java - 使用不同的唯一 id 提高每个线程的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10770003/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com