2016-06-27 2 views
1

J'écris un planificateur qui accepte un Runnable qui est mis en file d'attente pour l'exécution synchrone ou asynchrone.Comment indiquer à un Runnable de lancer une exception InterruptedException?

Je voudrais être en mesure d'implémenter un SomeScheduler.interrupt(int taskId) qui provoque un InterruptedException() à être lancé à partir de l'unité d'exécution.

Est-ce possible ou est-ce que tout va bien?

+0

Je pense avec la méthode 'sleep' – uzaif

+0

Utilisez-vous submit() ou execute()? Jetez un oeil à cette question: http://stackoverflow.com/questions/3929342/choose-between-executorservices-submit-and-executorservices-execute/35424481#35424481. Future.get() est utile pour obtenir InterruptedExeception et prendre des mesures correctives. –

Répondre

2

Thread s peut être interrompue, Runnable est juste la classe qui implémente la méthode d'exécution.
En soi, il n'appartient pas à un thread, si vous voulez interrompre l'exécution du runnable, vous devez interrompre son thread appelant.
La manière typique est d'utiliser un ExecutorService. Lorsque vous soumettez un runnable ou appelable au service de l'exécuteur, il renverra un Future, vous pouvez alors interrompre une tâche particulière en utilisant la méthode Future#cancel.
Notez que simplement interrompre le fil ne provoque pas InterruptedException d'être jeté à moins que le fil est en cours d'exécution du code qui vérifie l'état d'interruption et jette InterruptedException, par exemple la méthode Thread#sleep.

+0

mais vous ne pouvez pas faire cela puisque runnable ne l'a pas dans sa signature – Sarief

+0

@Sarief Runnable n'a pas quoi dans sa signature? – Magnus

+0

Il ne possède pas d'exception InterruptedException. Comme il est coché -> vous ne pouvez pas l'ajouter à la signature. – Sarief