35-案例实现
案例实现
根据如下步骤来实现本案例。
1.创建一个 ProducerConsumerTest
类,该类继承了 MultithreadedTestCase
:
public class ProducerConsumerTest extends MultithreadedTestCase {
2.创建一个字符型 LinkedTransferQueue
的私有对象,并取名为 queue
:
private LinkedTransferQueue<String> queue;
3.实现一个没有任何参数也没有返回值的 initialize()
方法。在该方法内部,请求父类的 initialize()
方法并初始化队列属性:
@Override
public void initialize() {
super.initialize();
queue=new LinkedTransferQueue<String>();
System.out.printf("Test: The test has been initialized\n");
}
4.实现包含第一个消费者逻辑的 thread1()
方法。在该方法内部,首先调用队列对象的 take()
方法,然后在控制台中打印出返回值:
public void thread1() throws InterruptedException {
String ret=queue.take();
System.out.printf("Thread 1: %s\n",ret);
}
5.实现包含第二个消费者逻辑的 thread2()
方法。 waitForTick()
方法使在第一个线程因为使用 take()
方法陷入休眠前保持等待,请求 queue
对象的 take()
方法并输出返回值到控制台中:
public void thread2() throws InterruptedException {
waitForTick(1);
String ret=queue.take();
System.out.printf("Thread 2: %s\n",ret);
}
6.实现包含生产者逻辑的 thread3()
方法。由于线程启动后将保持等待直到两个消费者线程阻塞在 take()
方法上,因此将调用两次 waitForTick()
方法,然后使用 put()
方法向队列中插入两个字符串:
public void thread3() {
waitForTick(1);
waitForTick(2);
queue.put("Event 1");
queue.put("Event 2");
System.out.printf("Thread 3: Inserted two elements\n");
}
7.实现 finish()
方法。在该方法中,首先打印相应的提示到控制台上,以表示已经完成测试,再使用 assertEquals()
方法检查是否已经消费完队列中的元素(此时队列的大小应该为0)。
public void finish() {
super.finish();
System.out.printf("Test: End\n");
assertEquals(true, queue.size()==0);
System.out.printf("Test: Result: The queue is empty\n");
}
8.实现本案例的主类,新建 Main
类和 main()
方法:
public class Main {
public static void main(String[] args) throws Throwable {
9.创建 ProducerConsumerTest
类型的 test
对象:
ProducerConsumerTest test=new ProducerConsumerTest(;
10.执行 TestFramework
类的 runOnce()
方法开始测试本案例:
System.out.printf("Main: Starting the test\n");
TestFramework.runOnce(test);
System.out.printf("Main: The test has finished\n");