저는 java.util.concurrent 패키지를 사용하고 있습니다. 숫자가 멀티 및 단일 스레드 전략을 사용하는 소수라면 다음 프로그램 테스트를 작성했습니다. 방법 에 대한java.util.concurrent : 소수 계산
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class IsPrime
implements Runnable
{
private static final long UPPER_BOUND=100000;
long value;//the number observed
private IsPrime(long value)
{
this.value=value;
}
/** returns wether value is a prime number (simple and stupid method) */
private boolean isAPrimeNumber()
{
if(value==1 || value==2) return true;
if(value%2L==0) return false;
for(long i=3;i< value;++i)
{
if(this.value%i==0) return false;
}
return true;
}
@Override
/** calls isAPrimeNumber */
public void run()
{
boolean result=isAPrimeNumber();
//if(result) System.out.println("["+this.value+"]");
}
/** loop from 3 to UPPER_BOUND, multithreaded */
private static long loopMT()
{
long now=System.currentTimeMillis();
ExecutorService service=Executors.newFixedThreadPool(10);
for(long i=3;i< UPPER_BOUND;i+=2)
{
service.submit(new IsPrime(i));
}
service.shutdown();
return System.currentTimeMillis()-now;
}
/** loop from 3 to UPPER_BOUND, NOT multithreaded */
private static long loop()
{
long now=System.currentTimeMillis();
for(long i=3;i< UPPER_BOUND;i+=2)
{
new IsPrime(i).run();
}
return System.currentTimeMillis()-now;
}
public static void main(String[] args)
{
long n1=IsPrime.loop();
long n2=IsPrime.loopMT();
System.out.println(""+n1+" >>> "+n2);
}
}
은 패키지 java.util.concurrent의의 클래스를 사용하는 올바른 방법입니다,을 loopMT? 이 프로그램을 작성하는 또 다른 (더 안전하고 더 우아한) 방법이 있습니까? System.out을 멀티 스레드 환경에서 사용할 수 있습니까? 귀하의 제안은 현재 완료하기 위해 제출 된 작업을 기다리고되지 loopMT
을 기록되면
피에르
왜 '호출 가능'대신'Runnable'을 구현하고 있습니까? –
finnw
정말 반환 값이 필요하지 않습니다. 내 진정한 프로그램 (이 프로그램이 아님)에서는 시간이 많이 걸리는 프로세스의 결과 만 인쇄하면됩니다. 이것이 내가 'void run (void)'에서 System.out을 주석 처리 한 이유입니다. – Pierre
질문 제목은 오해의 소지가 있습니다. 다중 코어 CPU에서 소수를 계산하는 데 최적화 된 방법을 찾은 것 같습니다. :) 그런 다음 나에게 분명히해라. System.out 인쇄 된 소수가 순서대로 인쇄 되길 원하니? – SyntaxT3rr0r