2010-11-11 30 views
1

竞争条件相当棘手,因为我必须learnJava线程化:将值传入线程(可能是竞态条件)

public class MyThread extends Thread { 
    private volatile boolean active; 
    private volatile Job job; 

    public MyThread() { 
     active = true; 
     job = null; 
    } 

    public void run() { 
     while (isActive()) { 
      if(job != null) { 
       doIt(); 
      } 
     } 
    } 

    public void finish() { 
     this.active = false; 
    } 

    public boolean isActive() { 
     return active; 
    } 

    private void doIt() { 
     int c = job.a + job.b; 
     job.result(c); 
     job = null; 
    } 

    public call processJob(Job j) { 
     this.job = j; 
    } 
} 

这正常工作,如果我使用的线程低量,但是当大量人同时运行运行到的问题。通过问题我的意思是job.result(c);不被称为一些线程,虽然他们都没有被停止。

我假设发生这种情况是因为如果通过processJob(j)从不同的进程调用,我无法正确添加作业。 问题:我应该怎么做才对?

+0

您如何计划设置(或修改)工作并激活? – 2010-11-11 23:57:19

+0

而问题是? – 2010-11-12 00:04:28

回答

2

在我看来,你似乎有一个consumer/producer设计。

我建议你使用线程安全集合,如BlockingQueue(或类似的东西)将数据从一个线程传递到另一个线程。

2

除了aioobe所说的,我会建议停止使用Thread类来完成这项工作,而是在java中使用并发包。您可以创建Callable课程并使用取消课程,该课程从ExecutorService返回。