Her er der et lidt grimt forsøg:
- import java.util.concurrent.Executors;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Future;
- import java.util.concurrent.Callable;
- import java.util.List;
- import java.util.LinkedList;
-
- public class T {
- public final static boolean isPrime(long num) {
- if (num < 2) return false;
- if (num == 2) return true;
- if (num % 2 == 0) return false;
-
- double sqrt = Math.sqrt(num);
- for (double i = 3; i <= sqrt; i += 2) {
- if (num % i == 0) {
- return false;
- }
- }
- return true;
- }
-
- private static class PrimaliteTesterCallable implements Callable<List<Long>> {
- private final long first;
- private final long last;
-
- public PrimaliteTesterCallable(long first, long last) {
- this.first = first;
- this.last = last;
- }
-
- [b]public List<Long> call() {
- List<Long> result = new LinkedList<Long>();
- for (long num = first; num <= last; num++) {
- if (isPrime(num)) {
- result.add(num);[/b]
- }
- }
- return result;
- }
- }
-
- public static void main(String[] args) throws Exception {
- int i = 0;
- [b] List<Future<List<Long>>> results = new LinkedList<Future<List<Long>>>();
- ExecutorService pool = Executors.newFixedThreadPool(10);[/b]
-
- [b]for (long l = 0; l <= 1000000; l += 1000) {
- Future<List<Long>> result = pool.submit(new PrimaliteTesterCallable(l, l + 999));
- results.add(result);[/b]
- }
-
- [b]for (Future<List<Long>> result : results) {
- List<Long> primes = result.get();
- for (Long prime : primes) {
- System.out.print(String.format("%9d ", prime));
- if (++i % 10 == 0) {
- System.out.println();[/b]
- }
- }
- }
- }
- }
Hver Callable objekt tester 1000 tal og returnerer en liste af dem, som er primtal. Jeg smider en masse af disse callables efter en threadpool, og for hver callable får jeg et Future objekt retur.
Disse Future objekter smider jeg i en liste i den rækkefølge, de oprettes i. Efterfølgende venter jeg på, at den første bliver færdig og udskriver dens resultat. Derefter fortsætter jeg med den næste, og bliver ved på den måde, til alle opgaverne er løst.
Det kan nok gøres kønnere, men det må du selv klare...håber det er til at gennemskue.
Hej,
tak for hjælpen først og fremmest - jeg påskønner virkelig din tid og insats - hvor er det dejligt at hjemmesider som udvikleren.dk kan hjælpe mig til at forstå java.
Jeg har dog et par spørgsmål til din kode som jeg håber du kan hjælpe mig med at klargøre.
Hvad mener du med gøres kønnere? Med henblik på hvilken del af koden?
Koden virker fint når jeg compiler i netbeans, men jeg har stadig nogle spørgsmål til de enkelte dele af koden og derfor ville det være en stor hjælp hvis du kunne lave nogle kommentarer til mig i de kodestykker jeg har fremhævet.
Kravet til opgaven er at implementere thread-klassen eller at implementere runnable interfacen.
Derudover kan vi implementere runnable-interfacen og bruger run-metoden. Jeg har læst mig frem til at runnable er et supplement til callable så har du mulighed for at lave dette om i koden således at du bruger runnable og indfører run-metoden i stedet for callable og call-metoden??
Endnu en gang stor tak for hjælpen
Vh Emilie
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package threading;
/**
*
* @author emiliebalslev
*/
class MyRunnable implements Runnable{
private int a;
public MyRunnable(int a){
this.a = a;
}
@Override
public void run(){
for (int i = 1; i <= a; ++i){
System.out.println(Thread.currentThread().getName() + " is " + i);
try{
Thread.sleep(1000);
}
catch (InterruptedException e){}
}
}
}
class MaiMyThread{
public static void main(String args[]){
MyRunnable thr1, thr2;
thr1 = new MyRunnable(5);
thr2 = new MyRunnable(10);
Thread t1 = new Thread(thr1);
Thread t2 = new Thread(thr2);
t1.start();
t2.start();
}
}
(det er i dette format jeg ønsker min flertrådede applikation skal være)
Indlæg senest redigeret d. 09.02.2013 21:24 af Bruger #16850