技术开发 频道

通过线程门实现Java并发编程

  发现素数

  接口com.javaworld.primefinder.PrimeNumberSearcher定义了组件必须遵循的契约。该契约的功能有方法findPrimeNumbers()来指定,如列表1所示。

  列表1.搜索契约

1 PrimeNumberSource findPrimeNumbers(BigInteger lowerBound,
2 BigInteger upperBound);

  com.javaworld.primefinder.PrimeNumberSource是结果句柄必须遵循的接口。它定义了一个方法BigInteger nextPrime(),当被调用时,它应该返回搜索结果缓冲器中的下一个元素。如果结果缓冲器已经被用完,必须返回null值来表示没有结果可用。正如此前所提到的,该方法的执行必须是线程安全的。

  需要指出的是,该示例应用程序任务的重点是找出指定搜索范围内的素数;因此我们可以使用来自java.math.BigInteger类的nextProbablePrime()方法。你可以在效用类com.javaworld.primefinder.PrimeUtil的一个静态方法中封装调用该方法,示例程序如列表2所示。

  列表2.在指定范围内发现首个素数的效用方法

1 public static BigInteger findFirstPrime(long lowerBound, long upperBound)
2
3   {
4
5   BigInteger result;
6
7   BigInteger startPos = BigInteger.valueOf(lowerBound);
8
9   BigInteger nextProbablePrime;
10
11   if (startPos.isProbablePrime(.....)) // some reasonable accuracy
12
13   nextProbablePrime = startPos;
14
15   else nextProbablePrime = startPos.nextProbablePrime();
16
17   if (nextProbablePrime.longValue() >= upperBound)
18
19   result = null;
20
21   else result = nextProbablePrime;
22
23   return result;
24
25   }

  现在已经定义了建立该解决方案的公共接口和工具,你现在可以对该任务进行细化了。我们将首先定义线程门的实现,它指定控制访问结果缓冲器的方式。

0
相关文章