0

我正在开发一个使用原始 Java 并发结构的项目,例如 wait()、notify()、notifyAll()、Thread.run()、synhronized 等。在我的项目中,有多个线程(Thread 类的扩展) 谁会定期从队列中获取对象。因此,我使用了一个具有内部 TimerTask 类的 Timer 类。

我的问题是,我无法让其他线程定期唤醒。我的主要课程不是这些线程或计时器类。因此,我称他们从另一个班级运行。我不知道如何让这些线程每 100 毫秒等待并通知一次。我的计时器课程是:

public class Controller extends Timer{

    int counter;
    TimerTask task;
    final Controller c = this;

    public class PeriodicTime extends TimerTask {

        @Override
        public void run() {

            if(counter > 0) {
                //do some stuff to wake up threads

            }
            counter++;
        }
    }

    Controller () {
        super ();
        this.task = new PeriodicTime();
        counter = 0;
        this.schedule(task, 300, 100);
    } 
}

我的线程类是:

public class Element extends Thread {


    public void run() {

        // do something to get an object from another class (a queue)
    }
}

现在,我真的很困惑如何定期释放线程类。我什至无法确定是否使用 wait()/notify()。

正如我之前所说,我将创建多个 Element 类。他们将同步工作。那么,我该怎么办?

4

1 回答 1

0

制作一个代表互斥体的对象列表,每个元素线程将从列表中获取一个互斥体,而计时器任务获取列表。

TimerTask 在时间段到期时对每个互斥对象调用 notify()。这会唤醒 Element 线程。

元素线程处理队列中的数据,当它们完成后,它们各自在互斥对象上调用 wait()。

现在您需要将线程安全内置到队列中,因为有多个消费者,但不需要阻塞逻辑,因为它由 TimerTask 处理。

另外,如果我理解正确,您希望 Elements 在处理数据时将某些内容放回队列中。为此,您可以使用一个辅助队列,您可以在元素完成后将其排入第一个队列,或者您可以交换它们(这是由 TimerTask 完成的,并且需要一个原子计数器,当 Element 唤醒时它会递增,当它消失时会递减睡觉)。或者,您可以使用一个“停止”值,您可以在唤醒元素之前将其放入队列中,并让它们工作直到它们到达它。对于 N 个元素线程,您需要放置 N 个停止值,以便所有线程都能收到消息。

如何使用互斥锁:

List<Object> mutexList;
//initialize the list with plain Objects. You just need them to be separate instances.
....
//When creating Element threads add one object from the list to each Element.
....
//in Element code
public class Element extends Thread {
   //This is one element from the list 
   private Object mutex;


    public void run() {
       // do something to get an object from another class (a queue)
       //....
       synchronized(mutex){ 
          mutex.wait();
       }
    }
}
// in timerTask code
 public class PeriodicTime extends TimerTask {

    List<Object> mutexList;

    @Override
    public void run() {

        if(counter > 0) {
            //do some stuff to wake up threads
           for(Object mutex:mutexList){
                mutex.notify();
           }
        }
        counter++;
    }
}
于 2014-12-26T14:29:43.080 回答