gpt4 book ai didi

java - 划分每个线程在特定范围内使用ID

转载 作者:行者123 更新时间:2023-11-30 11:35:53 25 4
gpt4 key购买 nike

我正在做一个项目,我需要确保每个线程都是唯一的 ID每次都在特定范围内。例如-

如果number of threads is 2number of tasks is 10那么每个线程将执行 10 个任务。所以这意味着 2 个线程将执行 20 个任务。

所以我正在寻找这样的东西-

在上面的例子中,第一个线程应该使用 id between 1 and 10第二个线程应该使用 id between 11 and 20 .

另一个例子。所以假设如果我有 3 threadnumber of tasks as 20那么第一个线程应该在 1 and 20 之间使用 ID第二个线程应该在 21 and 40 之间和 41 and 60 之间的第三个线程.

下面是我到目前为止的代码,它所做的是它将获得 id 作为 AtomicInteger我每次都从 1 开始获得唯一的 ID。

class ThreadTask implements Runnable {
private final AtomicInteger id;
private int noOfTasks;

public ThreadTask(AtomicInteger id2, int noOfTasks) {
this.id = id2;
this.noOfTasks = noOfTasks;
}

@Override
public void run() {

while(noOfTasks > 0) {
System.out.println(id.getAndIncrement());
// And use this id for other things.
noOfTasks--;
}
}
}

public class XMPTest {

public static void main(String[] args) {

final int noOfThreads = 2;
final int noOfTasks = 10;

final AtomicInteger id = new AtomicInteger(1);

//create thread pool with given size
ExecutorService service = Executors.newFixedThreadPool(noOfThreads);

// queue some tasks
for (int i = 0; i < noOfThreads; i++) {
service.submit(new ThreadTask(id, noOfTasks));
}
}
}

我如何限制线程 1 的 ID 应介于 1 and 10 之间?第二个线程应该在 11 and 20 之间获得 id

更新代码:-我正在尝试下面的代码

public static void main(String[] args) {

final int noOfThreads = 2;
final int noOfTasks = 10;

//create thread pool with given size
ExecutorService service = Executors.newFixedThreadPool(noOfThreads);

// queue some tasks
for (int i = 0, int nextId = 1; i < noOfThreads; i++, nextId += noOfTasks) {
service.submit(new ThreadTask(nextId, noOfTasks));
}
}


class ThreadTask implements Runnable {
private final int id;
private int noOfTasks;

public ThreadTask(int nextId, int noOfTasks) {
this.id = nextId;
this.noOfTasks = noOfTasks;
}

public void run() {

for (int i = id; i <= noOfTasks; i++) {
System.out.println(i);
}
}
}

因此对于第一个线程,它打印出 1 - 10,这很好。但是在第二个线程中,nextId 是 11,noOfTasks 是 10,所以我的 for 循环将第二次在 run 方法中工作。

最佳答案

在启动线程之前,在单线程代码中根据需要拆分范围,然后将范围传递给每个线程。

例如:

public static void main(String[] args) {

final int noOfThreads = 2;
final int noOfTasks = 10;

//create thread pool with given size
ExecutorService service = Executors.newFixedThreadPool(noOfThreads);

// queue some tasks
for (int i = 0, int nextId = 1; i < noOfThreads; i++, nextId += noOfTasks) {
service.submit(new ThreadTask(nextId, noOfTasks));
}
}

class ThreadTask implements Runnable {
private final int id;
private int noOfTasks;

public ThreadTask(int nextId, int noOfTasks) {
this.id = nextId;
this.noOfTasks = noOfTasks;
}

public void run() {

for (int i = id; i < id + noOfTasks; i++) {
System.out.println(i);
}
}
}

关于java - 划分每个线程在特定范围内使用ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14824628/

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