Cancella cache per l'applicazione java


Sto cercando di scrivere un programma che rileva quando le cuffie sono collegate al sistema e quindi eseguire un altro pezzo di codice quando si rimuovono le cuffie. Il codice funziona bene, ma il problema che sto affrontando è che lo stato del dispositivo viene memorizzato nella cache, quindi solo 1 minuto dopo aver estratto le cuffie il mio programma rileva che è stato rimosso. Questo accade quando eseguo il codice è un ciclo while infinito.

Ma se eseguo singole istanze non in un ciclo mostra lo stato corretto immediatamente in corsa

Ecco il codice :

        public class Headphonecheck {

             public static int hpfound = 0;
             public static int hpnfound =0;

             public static void isHeadphoneAvailable() {
                while (true)
                    {
                  if     (!AudioSystem.isLineSupported(Port.Info.HEADPHONE) && hpnfound ==0) {
                        System.out.println("NO HEADPHONE FOUND");
                       System.out.println("Do something else");
                       hpfound = 0;
                       hpnfound = 1;

                    } else {
                    if(AudioSystem.isLineSupported(Port.Info.HEADPHONE) && hpfound ==0){
                       System.out.println("HEADPHONE FOUND");
                       System.out.println("Do something");
                       hpnfound = 0;
                       hpfound =1;
                    }
                }

                } //close while

            }

        public static void main (String[] args){
            isHeadphoneAvailable();
        }
}

Se rimuovi il ciclo while ed esegui il codice, funziona perfettamente per una singola esecuzione .. cioè si collega le cuffie e si esegue il codice che mostra la CUFFIA TROVATA e poi quando si rimuovono le cuffie e si esegue il codice che non mostra NESSUNA CUFFIA TROVATA.

Nel ciclo while una volta se hai la cuffia ed esegui il codice mostra la CUFFIA TROVATA e poi se rimuovi la cuffia immediatamente ci vogliono circa 50 secondi per mostrare NESSUNA cuffia TROVATO. questo perché lo sta memorizzando nella cache per 50 secondi e quindi cancellando la cache

COME FACCIO A IMPEDIRGLI DI MEMORIZZARE NELLA CACHE O CANCELLARE LA CACHE

Author: user1492955, 2012-07-05

2 answers

Qual è la latenza del tuo obiettivo?

È possibile impostare "singole esecuzioni"ripetute? (Ad esempio, tramite un timer?)

Mi aspetterei che il ciclo while venga eseguito continuamente per una "slice" e che la sua risposta sia correlata alla dimensione e alla spaziatura delle "slice". Ma i thread normalmente non vengono eseguiti con 50 secondi di anticipo! Anche 50 msec è un po ' eccessivo. Quindi questa non può essere la spiegazione totale per la quantità di cache che stai ricevendo.

In ogni caso, eseguire un ciclo while come si fa sembra costoso in termini di cpu per un evento che si verifica raramente e può richiedere solo, ad esempio, una precisione di 50 msec? (Attualmente, il ciclo while sta testando microsecondi contigui o addirittura nanosecondi, non esattamente un test ad alto rendimento.) Un ciclo di timer che ripete un singolo sondaggio ogni 50 millisecondi dovrebbe essere un uso significativamente migliore delle risorse in tutto.

Una nota aggiuntiva, se si prende il percorso del timer: un ScheduledThreadPoolExecutor viene pubblicizzato come superiore a util.Timer, e da preferire per Java 1.5 e oltre, da Goetz / Bloch / Lea / others in "Java Concurrency in Practice". Dicono che fa un lavoro migliore nel gestire le eccezioni non controllate.

Un'altra possibilità: mettere un thread.sleep (50) o somesuch valore nel tuo ciclo while e questo potrebbe aiutare in un modo equivalente all'utilizzo di TimerTasks.

Non posso dire con certezza che questo risolverà il problema, ma almeno la "cache" non sarà così grande di conseguenza, e le prestazioni dovrebbero migliorare complessivamente, leggermente.

 0
Author: Phil Freihofner, 2012-07-05 19:58:49

Sembra che tu debba aggiungere un listener di eventi. Non vuoi davvero cercare queste informazioni in loop, vuoi essere avvisato quando cambia. Non ho mai lavorato personalmente con questo sistema prima, ma sembra che l'interfaccia a linea ti consenta di aggiungere un LineListener per gli eventi.

Il codice sarebbe simile a questo:

...

if(AudioSystem.isLineSupported(Port.Info.HEADPHONE) && hpfound ==0){ 
  Line line = AudioSystem.getLine(Port.Info.HEADPHONE);
  line.addLineListener(new LineListener() {
       public void update(LineEvent event) {
         switch (event.getType()) {
           CLOSE: doSomethingOnClose();
           STOP: doSomethingOnStop();
           // etc...
         }
       }
     });
}

...
 0
Author: bluejekyll, 2012-07-05 20:57:05