Ciao a tutti, devo scrivere un programma che prenda da input due valori, Accuracy e Time Limit dopo il quale il thread va in interruzione, e crei un thread che calcoli all'infinito l'approssimazione di Pigreco fin quando l'Accuracy non è più rispettata o il thread è interrotto. Non riesco però a capire come posso testare il flag interrupt nel metodo che esegue il calcoli poichè non riconosce la classe thread da me creata nel main. La domanda è sicuramente banale, ho iniziato da pochissimo ad usare JAVA, come dovrei fare per risolvere il problema?
Grazie in anticipo
N.B: Il calcolo di PI è eseguito con la serie Gregory-Leibniz (π = 4/1 – 4/3 + 4/5 - 4/7 + 4/9 - 4/11 ...)
Grazie in anticipo
N.B: Il calcolo di PI è eseguito con la serie Gregory-Leibniz (π = 4/1 – 4/3 + 4/5 - 4/7 + 4/9 - 4/11 ...)
Codice:
//Metodo per il calcolo di PI che crea il thread con Runnable//
public class Calculator implements Runnable{
private double number;
public Calculator (double number) {
this.number= number;
}
public void run() {
int cont= 1; // Per sapere quando sottrarre o addizionare//
double pi= 0.0;
double i= 1.0;
while (Math.abs(pi-Math.PI)>=number && !T.interrupted()) {
if (cont%2!=0) {
pi= pi + 4/i;
}
else {
pi= pi - 4/i;
}
System.out.println("Current PI value is: " + pi);
i= i+2;
cont= cont + 1;
if (Math.abs(pi-Math.PI)<number) {
System.out.println("Accuracy out of bound");
return;
}
if (T.interrupted()) {
System.out.println("Thread has been interrupted");
return;
}
}
}
}
Codice:
// Main method per i valori da input, creazione child thread e interruption//
import java.util.Scanner;
public class A1Runnable {
public static double x;
public static int y;
public static void main (String[] args) {
Scanner input1 = new Scanner (System.in);
x= input1.nextDouble();
Scanner input2 = new Scanner(System.in);
y= input2.nextInt();
Calculator calculator= new Calculator(x);
Thread T= new Thread(calculator);
T.start();
try {
System.out.println("Sleeping");
Thread.sleep(y); //Main thread dorme "Time Limit" e quando si sveglia interrompe il child thread//
T.interrupt();
}
catch (InterruptedException e) {
throw new RuntimeException("Thread" + "Interrupted");
}
}
}
Ultima modifica: