DOMANDA Thread.interrupt() JAVA

SaltyNenno

Nuovo Utente
58
7
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:

lolloCreator

Nuovo Utente
69
7
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
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,923
11,563
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
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.
 

Andretti60

Utente Èlite
6,440
5,091
Devi usare try/catch nel working thread, usando InterruptedException :
Java:
public void run()
{ 
   try { ... }
   catch (InterruptedException e) { ... }
}
 

SaltyNenno

Nuovo Utente
58
7
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.
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,923
11,563
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
Ho provato ad effettuare la sostituzione ma mi dice che il metodo "interrupted" non è definito in calculator
E' vero, questo perché Calculator non è implementata come estensione della classe Thread;
in tal caso devi usare il metodo statico suggerito da @Andretti60
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili