Come si può creare un'attività che fa apparire l'etichetta occupata ed è annullabile durante l'esecuzione?

StackOverflow https://stackoverflow.com/questions/811998

Domanda

Sto scrivendo un'applicazione in Java (1.6) usando swing. Al momento ho un JXBusyLabel su un JXLayer nell'area del contenuto del mio programma che funge da indicatore di occupato. Voglio fornire un modo per consentire ad altri che lavorano con me di creare un'attività che fa apparire l'etichetta occupata durante l'esecuzione. Il problema è che l'attività deve essere annullabile. Qual è il modo migliore per esporre la funzionalità che desidero?

Alcune idee che ho trovato:

  1. Accesso non elaborato a setBusy ()
    Questo è ovviamente il più semplice per me, ma richiede agli utenti di conoscere e comprendere i problemi di threading swing.
  2. public < T > Future lt &; T gt &; execute (Callable lt &; T gt &;)
    Avvolge il callable in un FutureValue che viene eseguito () su un thread separato e restituisce quel FutureValue. La domanda diventa quindi: come tenere traccia di tutti i FutureValue generati e come garantire che possano essere cancellati. (ad esempio, annulla (vero) annulla sempre)

Non ho mai usato il pacchetto di concorrenza in Java prima e non esisteva quando ho "imparato" Java. Quindi sono aperto a modi completamente nuovi e diversi di implementare questa funzionalità.

Modifica: Chiarimento della mia domanda. Conosco SwingWorker. Non l'ho mai usato. Quello che voglio sapere è questo:
Dato un callable (versione Java di una chiusura?) Come posso:

  1. Restituisce il valore di call () all'utente senza blocco (penso di dover usare un Future per questo)
  2. Di 'al JXLayer di bloccare (avvia il pittore), esegue il callable in dotazione, quindi sblocca il JXLayer (ferma il pittore)
  3. Assicurati che, indipendentemente da ciò che il thread chiama la mia funzione busyExec (), la GUI rimanga reattiva e l'attività in background venga completata. (NOTA: se restituisco una sorta di oggetto Future e chiamano get () sul thread dell'evento, può / verrà bloccato e va bene)

Suppongo che il mio principale punto di ostacolo sia come implementare il n. 2. Dovrei avere busyExec () scartare un nuovo thread che si blocca finché non vengono eseguite attività in background? Dovrei provare per una sorta di coda. C'è un oggetto che farà già tutto questo per me?

È stato utile?

Soluzione 2

Va bene. Per chiunque sia interessato qui è quello che sto attualmente usando per implementare la mia richiesta.

Ho un metodo che prenderà un Callable < T > ;. Crea quindi un FutureTask & Lt; T & Gt; questo verrà restituito al chiamante come questo come Futuro < T > ;. A JXBusyLabel e JXLayer viene detto di iniziare a dipingere e di bloccare l'interfaccia utente. FutureValue e Thread (vedi sotto) sono accodati in un elenco speciale. Viene creato un Runnable che: chiama run () su FutureTask, rimuove FutureValue (e thread) dall'elenco e, se l'elenco è vuoto, sblocca JXLayer e arresta JXBusyLabel. Questo Runnable viene lanciato in una nuova discussione con priorità normale.

Quando l'utente preme il pulsante Annulla. L'elenco è ripetuto e i FutureTask vengono tutti cancellati e rimossi dall'elenco se potevano essere cancellati. Per prima cosa prova a annullare (falso), quindi a annullare (vero). Se entrambi questi mezzi falliscono, all'utente viene richiesto un avviso che chiede loro se desiderano Thread.stop () l'attività e spiega che ciò potrebbe rendere instabile l'app. In caso affermativo, interrompere () il thread che esegue l'attività. Questo potrebbe far cadere l'app. In tutti i casi, l'interfaccia utente è sbloccata.

La documentazione per gli altri membri del team afferma che devono essere consapevoli che l'attività può essere uccisa. Non devono chiamare get () fino a quando isDone () è true. Viene esplicitamente detto che ciò li costringerà sostanzialmente a bloccare fino a quando l'attività non viene eseguita o annullata. Quindi non possono chiamarlo dal thread di invio dell'evento.

Altre soluzioni sono ancora benvenute

Altri suggerimenti

Il SwingWorker ( di Java 6) implementa Future quindi sembra che abbia la possibilità di annullare le attività tramite cancel .

Ulteriori informazioni su <=> da The Java Tutorials :

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top