作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想看看 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/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!