我试图看看Java中的单个线程是否可以在每个任务都是无限循环的任务之间切换?
我有以下代码,我想知道是否有任何可能的方法,我可以计算所有三个工作低于更改,而他们在单线程上运行?也许使用wait / notify?
我只能为一项工作改变计数,但不能改变所有三份工作。
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");
}
}
答案 0 :(得分:1)
您当前代码无法正常工作的原因可以在the documentation中找到:
如果在所有线程都处于活动状态时提交了其他任务,则会执行 将在队列中等待,直到线程可用
你的第一份工作永远在运行,因此其他工作永远不会被排除在外。
解决这个问题的一种方法是让每个Job在完成一次迭代后将自己添加到队列的后面。这允许队列中的其他项目有时间执行:
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);
答案 1 :(得分:0)
否:当一个线程被分配给一个任务时,它会执行run()
方法。当run方法返回或有异常时,下一个任务将被分配给线程。