发现素数
接口com.javaworld.primefinder.PrimeNumberSearcher定义了组件必须遵循的契约。该契约的功能有方法findPrimeNumbers()来指定,如列表1所示。
列表1.搜索契约
<
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
>
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.在指定范围内发现首个素数的效用方法
<
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
>
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
}
现在已经定义了建立该解决方案的公共接口和工具,你现在可以对该任务进行细化了。我们将首先定义线程门的实现,它指定控制访问结果缓冲器的方式。