Ripetizione di Task

di il
18 risposte

18 Risposte - Pagina 2

  • Re: Ripetizione di Task

    HalJordan ha scritto:


    Avevo pensato ad un oggetto di tipo AtomicBoolean come flag, però poi potrei ritrovarmi nel caso in cui t1 smette, t2 stampa ed esce, e non è un caso accettabile.
    AtomicBoolean va anche bene (dal momento che t2 opera in "polling" per sapere se terminare oppure continuare il while).

    Però, scenario (AtomicBoolean false=continua ; true=termina):
    t1 sta per terminare e prima di concludere setta il AtomicBoolean a true.
    Se t2 ha "appena" fatto il test sul AtomicBoolean e lo ha visto false ... ovviamente esegue il corpo del while e fa la stampa. Il true lo vedrà solo al "giro" dopo. Questo sì, PUÒ capitare e se è questo che non ti va bene, bisogna fare diversamente.

    HalJordan ha scritto:


    Il problema non conosco bene la differenza tra interrupted e isInterrupted, o meglio ho difficoltà nel capirla. Ci provo

    interrupted() riporta lo stato di interruzione del Thread che lo chiama quindi t1.interrupted ritorna lo stato di t1, ma non capisco perchè cancella lo stato o meglio la flag e perchè la seconda chiamata set a false.

    isInterrupted() riporta lo stato di interruzione del Thread su cui viene chiamato. Quindi se faccio t1.isInterrupted in t2 mi dici false perchè t2 non è interrotto.
    La documentazione javadoc lo dice chiaramente: interrupted() "pulisce" lo status di interrupted mentre isInterrupted() non lo "pulisce". La differenza sta lì.

    Ma lo ripeto ancora, se vuoi che il meccanismo di interruption "funzioni", allora:
    - in t1 devi fare t2.interrupt()
    - in t2 lo testi con Thread.interrupted()
  • Re: Ripetizione di Task

    Inserisco t2 in una coda bloccante.
    In T1 - q.take().interrupt() post while
    In T2 - come mi dicevi while(!Thread.interrupted())

    Per come mi hai descritto interrupted, posso usare comunque isInterrupted().
  • Re: Ripetizione di Task

    HalJordan ha scritto:


    Inserisco t2 in una coda bloccante.
    E cosa c'entra una coda bloccante??

    HalJordan ha scritto:


    In T1 - q.take().interrupt() post while
    che senso ha???

    HalJordan ha scritto:


    Per come mi hai descritto interrupted, posso usare comunque isInterrupted().
    Essendo solo per far terminare t2, sì, non farebbe differenza.
  • Re: Ripetizione di Task

    Perchè sto fuso tra ingegneria, java e tesi , e non sapevo come passare a t1: t2.interrupt(). Ma ora ho invertito le due implementazioni, nel codice prima scrivo t2 e poi t1

    
    public static void main(String[] args){
            List<Integer> list=new LinkedList<>();
            Random r=new Random();
            Thread t2=new Thread(()->{
                while(!Thread.currentThread().isInterrupted()) {
                    try {
                        Thread.currentThread().sleep(10000);
                    } catch (InterruptedException e) {
                        return;
                    }
                    synchronized (list) {
                        int sum = 0;
                        for (Integer i : list) {
                            sum = i + sum;
                        }
                        System.out.println("SOMMA: " + sum);
                    }
                }
            });
    
            Thread t1=new Thread(()->{
                   int i;
                   while((i=r.nextInt(1000))%100!=0){
                       try {
                           Thread.currentThread().sleep(1000);
                       } catch (InterruptedException e) {
                           return;
                       }
                       synchronized(list) {
                           list.add(i);
                           System.out.println("" + i);
                       }
                   }
                   t2.interrupt();
                   System.out.println("FINALE:"+i);
            });
            t1.start();
            t2.start();
Devi accedere o registrarti per scrivere nel forum
18 risposte