当前位置: 首页 > 知识库问答 >
问题:

带Lambda表达式的线程

商飞尘
2023-03-14

我在第42和43行出现错误:线程T1=新线程(()->prod.test());,线程T2=新线程(()->cons.test());未处理的异常类型InterruptedException。如果我尝试quickfix,它将创建带有catch异常的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());
    }

}

共有1个答案

农飞翔
2023-03-14

您已经创建了一个函数接口谓词,其方法被声明为抛出interruptedexception,这是一个检查异常。但是,您可以在lambda表达式的主体中调用test()作为线程构造函数的参数,该构造函数接受runnable,其run()方法未声明以引发任何检查异常。因此,由于未在正文中捕获异常,因此会发生编译器错误。

顺便说一句,将自己的接口命名为predicate可能会令人困惑,因为内置函数接口java.util.function.predicate,其函数方法返回boolean

因为run()不能引发异常,所以必须捕获异常并处理它。您可以记录异常及其堆栈跟踪。您可以将异常包装在runtimeException中。无论哪种方式,捕获checked异常都将允许编译代码。示例:

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);
    }
});
 类似资料:
  • 问题内容: 我在线路42和43的误差:, 未处理的异常类型InterruptedException的 。如果我尝试快速修复,它将使用catch Exception 创建try catch ,它将具有相同的错误,并且将尝试以相同的方式修复它,并继续用try catch包围它。 问题答案: 您已创建一个函数接口,该函数接口的方法声明为引发,这是一个已检查的异常。但是,你叫一个lambda表达式作为参数

  • 我想使用方法按长度对数组中的字符串元素进行排序。我在这里被告知,可以使用lambda表达式而不是创建实现比较器的新类。用完全相同的方式做了,但它不起作用。

  • (译注:目前支持lambda的gcc编译器版本为4.5,其它详细的编译器对于C++11新特性的支持请参考http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport) Lambda表达式是一种描述函数对象的机制,它的主要应用是描述某些具有简单行为的函数(译注:Lambda表达式也可以称为匿名函数,具有复杂行为的函数可以采用命名函数对象,当然,何谓复杂

  • Lambda表达式在Java 8中引入,并被吹捧为Java 8的最大特性.Lambda表达式有助于函数式编程,并简化了很多开发。 语法 (Syntax) lambda表达式的特征在于以下语法。 parameter -> expression body 以下是lambda表达式的重要特征。 Optional type declaration - 无需声明参数类型。 编译器可以从参数的值推断出相同的

  • 假设我在DB的表格中有以下记录。 这里的Emplid和date组合是我的主键。每次更改我都会保存记录的版本。(在最后3行中,共有3个版本作为数量变化)。 现在我想获取最新版本的记录,其中emplid=1111 date=28-02-2019(用户不知道数据库中有多少版本)。 我怎么能用lambda表达式呢。 这会给我vesrion 1。但是我怎样才能得到最新的版本呢。

  • 问题内容: Java8中添加了Lambda表达式。我想理解为什么这很重要。对于尚未接触函数式编程习惯的Java程序员意味着什么?这是否意味着我可以编写出性能更好的代码或可大规模扩展的代码,还是只会使代码的详细程度降低。或全部。 问题答案: Oracle已经提供了有关该主题的教程。它列出了几个很好的用例。 在找到链接之前,我要说的是lambda表达式可让您将“函数”传递给代码。因此,您可以更轻松地编