DOMANDA Thread.interrupt() JAVA

Pubblicità

SaltyNenno

Nuovo Utente
Messaggi
58
Reazioni
7
Punteggio
27
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 ...)


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:
Hai provato a dare un valore di ritorno?
Prova ad aggiungere queste righe nel try{}
Java:
    boolean success = performTask();

    if( success == false ){
        return; //fine del thread
    } 
    // Altrimenti continua se success == true
 
nel metodo run() hai messo diverse volte l'istruzione (a volte con la negazione "!")
T.interrupted()
è ovvio che ti da un errore perché T non è definito nella classe Calculator;
devi mettere this.interrupted() e poi riprova a compilare.
 
Devi usare try/catch nel working thread, usando InterruptedException :
Java:
public void run()
{ 
   try { ... }
   catch (InterruptedException e) { ... }
}
 
nel metodo run() hai messo diverse volte l'istruzione (a volte con la negazione "!")
T.interrupted()
è ovvio che ti da un errore perché T non è definito nella classe Calculator;
devi mettere this.interrupted() e poi riprova a compilare.
Ho provato ad effettuare la sostituzione ma mi dice che il metodo "interrupted" non è definito in calculator


Devi usare try/catch nel working thread, usando InterruptedException :
Java:
public void run()
{
   try { ... }
   catch (InterruptedException e) { ... }
}

Ho provato ad aggiungere il try-catch nel Calculator ma mi dice che "non darà mai una Exception".

Altrimenti non potrei sostituire l'IF di T.interrupted con un test dello stato del main thread? Se non è in sleeping significa che si è svegliato, ha interrotto il thread che esegue i calcoli e pertanto potrei fare un return, sarebbe corretto? Tra l'altro come potrei testare una cosa simile, ovvero che il main thread sia in esecuzione e non in sleeping.
Mi è venuto anche qualche dubbio sul modo in cui interrompo il child thread T nel try del main, lo interrompe effettivamente oppure no? perchè ho provato a mettere un return dopo la sleep, in modo che appena svegliato interrompa l'esecuzione ma non ha l'effetto sperato. Nel senso che finchè non supera l'accuracy non si interrompe comunque.
 
Pubblicità
Pubblicità
Indietro
Top