gpt4 book ai didi

java - 我们可以用Java实现协程类型的功能吗?

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

我想看看 Java 中是否有单个线程可以在每个任务都是无限循环的任务之间切换?

我有以下代码,我想知道是否有任何可能的方法可以使下面所有三个作业的计数在单线程上运行时发生变化?也许使用等待/通知?

我只能更改一项作业的计数,但无法更改所有三项作业的计数。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class Job implements Runnable {
protected int count;
public Job(){
this.count = 0;
}

public void run() {
System.out.println(Thread.currentThread().getName());
while(true) {
this.count = this.count + 1;
System.out.print("");
}
}
}


public class ThreadTest {

static int tasks = 3;
static Job[] jobs = new Job[3];

public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(1);
for (int i = 0; i < tasks; i++) {
jobs[i] = new Job();
executor.execute(jobs[i]);
}

while (!executor.isTerminated()) {
for (int i = 0; i < tasks; i++) {
System.out.print(jobs[i].c + " ");
}
System.out.println();
try { Thread.sleep(1000); } catch (InterruptedException ex) { }
}
System.out.println("end");
}
}

最佳答案

您当前的代码不起作用的原因可以在 the documentation 中找到:

If additional tasks are submitted when all threads are active, they will wait in the queue until a thread is available

您的第一个作业将永远运行,因此其他作业永远不会从队列中取出。

解决此问题的一种方法是让每个作业在完成一次迭代后将其自身添加到队列的后面。这允许队列中的其他项目有时间执行:

class Job implements Runnable {
protected int count;
private final ExecutorService executor;

public Job(ExecutorService executor){
this.count = 0;
this.executor = executor;
}

public void run() {
System.out.println(Thread.currentThread().getName());

this.count = this.count + 1;
System.out.print("");

executor.execute(this);
}
}

你需要改变

new Job();

new Job(executor);

关于java - 我们可以用Java实现协程类型的功能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48439041/

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