我们可以在Java中实现协程类型的功能吗?

时间:2018-01-25 08:58:38

标签: java concurrency

我试图看看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");
    }
}

2 个答案:

答案 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方法返回或有异常时,下一个任务将被分配给线程。