T4l*_*l0n 14 java lambda multithreading interrupted-exception
我在第42和43行有一个错误:Thread t1=new Thread(()->prod.test());,Thread t2=new Thread(()->cons.test()); 未处理的异常类型InterruptedException.如果我尝试quickfix它将创建带有捕获异常的try catch ,它将具有相同的错误,并将尝试以相同的方式修复它,继续用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());
}
}
Run Code Online (Sandbox Code Playgroud)
rge*_*man 15
您已经创建了一个功能接口,Predicate其方法被声明为throw InterruptedException,这是一个经过检查的异常.但是,您test()将lambda表达式的主体调用为构造函数的参数,该Thread构造函数采用aRunnable,其run()方法未声明为抛出任何已检查的异常.因此,由于异常未在正文中捕获,因此会发生编译器错误.
顺便说一下,Predicate由于功能方法返回的内置功能接口java.util.function.Predicate,命名您自己的接口可能会令人困惑boolean.
因为run()不能抛出Exception,你必须catch处理异常并处理它.您可以记录异常及其堆栈跟踪.您可以将异常包装在一个RuntimeException.无论哪种方式,捕获已检查的异常将允许代码编译.例:
Thread t1 = new Thread(() -> {
try {
prod.test();
} catch (InterruptedException e) {
// handle: log or throw in a wrapped RuntimeException
throw new RuntimeException("InterruptedException caught in lambda", e);
}
});
Run Code Online (Sandbox Code Playgroud)
如果你打算只运行一个没有参数的方法,你可以用方法引用替换 lambda。
例如:
Thread t = new Thread(() -> {
foo();
});
Run Code Online (Sandbox Code Playgroud)
可以更简洁地表示为
Thread t = new Thread(this::foo);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16159 次 |
| 最近记录: |