Avec du fil d'expression Lambda
J'ai une erreur à la ligne 42 et 43 : Thread t1=new Thread(()->prod.test());
, Thread t2=new Thread(()->cons.test());
exception non Gérée du type InterruptedException . Si j'essaie de quickfix il a créé le try catch avec un catch Exception, il aura la même erreur et va essayer de le résoudre de la même manière continue de l'entourer avec des try catch.
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
interface Predicate {
public void test() throws InterruptedException;
}
class MyClass {
int num = 0;
Lock lock = new ReentrantLock();
public void produce() throws InterruptedException {
lock.lock();
for (int i = 0; i < 1000; i++) {
num++;
Thread.sleep(1);
}
lock.unlock();
}
public void consume() throws InterruptedException {
lock.lock();
for (int i = 0; i < 1000; i++) {
num--;
Thread.sleep(1);
}
lock.unlock();
}
public int getNum() {
return num;
}
}
public class Main00 {
public static void main(String[] args) throws InterruptedException {
MyClass c = new MyClass();
Predicate prod = c::produce;
Predicate cons = c::consume;
Thread t1 = new Thread(() -> prod.test());
Thread t2 = new Thread(() -> cons.test());
long start = System.currentTimeMillis();
t1.start();
t2.start();
t1.join();
t2.join();
long end = System.currentTimeMillis();
System.out.println("time taken " + (end - start) + " num = "
+ c.getNum());
}
}
Vous devez vous connecter pour publier un commentaire.
Vous avez créé une interface fonctionnelle
Predicate
dont la méthode est déclarée à jeter unInterruptedException
, qui est un checked exception. Cependant, vous appeleztest()
dans le corps d'une expression lambda comme paramètre de leThread
constructeur qui prend unExécutable
, dontrun()
méthode n'est pas déclarée à jeter tout vérifié exceptions. Donc, parce que l'exception n'est pas pris dans le corps, une erreur de compilation se produit.Il peut d'ailleurs être source de confusion pour le nom de votre propre interface
Predicate
, en raison de la intégré dans l'interface fonctionnellejava.util.fonction.Prédicat
dont la méthode renvoie uneboolean
.Parce que
run()
ne pouvez pas lancer uneException
, vous devezcatch
l'exception et le gérer. Vous pouvez enregistrer l'exception et sa trace de la pile. Vous pouvez envelopper l'exception dans unRuntimeException
. De toute façon, la capture faisant l'objet d'une exception permettra le code à compiler. Exemple:Comme @rgettman dit, le nom
Predicate
est malheureux... de toute façon, vous pouvez prendre avantage dedefault
méthodes en Java:Ensuite, dans votre méthode principale, il suffit de créer les threads en appelant le défaut
tryTest()
méthode:Si vous envisagez sur l'exécution d'une méthode unique, sans arguments, vous pouvez remplacer le lambda avec une méthode de référence.
Par exemple:
peut être plus succinctement exprimée en