请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

如果线程不是new Runnable()而是使用lambada的话三次都会调用计算不走缓存,怎么回事呢?

如果线程不是new Runnable()而是使用lambada的话三次都会调用计算不走缓存,怎么回事呢?就是重复计算问题没解决,

正在回答 回答被采纳积分+3

2回答

悟空 2021-04-12 17:58:50

可以看下这个思路:http://coding.imooc.com/learn/questiondetail/2vGBE6xZZA9YNkaq.html

0 回复 有任何疑惑可以回复我~
悟空 2021-04-12 17:57:47

lambada的并行,如果里面用的是同一个expensiveComputer实例,那么和new Runnable()是一致的。lambada有自己的线程池。

0 回复 有任何疑惑可以回复我~
  • 用的是同一个expensiveComputer实例,但是和new Runnable()不一致?
    public static void main(String[] args) throws Exception {
            ImoocCache3<String, Integer> expensiveComputer = new ImoocCache3<>(
                    new ExpensiveFunction());
            new Thread(() -> {
                try {
                    Integer result = expensiveComputer.compute("666");
                    System.out.println("第一次的计算结果:"+result);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }).start();
            new Thread(() -> {
                try {
                    Integer result = expensiveComputer.compute("666");
                    System.out.println("第三次的计算结果:"+result);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }).start();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Integer result = expensiveComputer.compute("667");
                        System.out.println("第二次的计算结果:"+result);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    会输出三次“从FutureTask调用了计算函数”?
    回复 有任何疑惑可以回复我~ 2021-12-29 14:46:29
  • 悟空 回复 小曼巴0 #2
    这个我试过了,不是lambda表达式的问题,如果用Runnable对象同样可能有重复计算问题,因为大家是同一时间去做的compute,而且667用不上666的缓存。你试一下在第3次计算前,sleep一下,就会发现,不会重复计算了。
    回复 有任何疑惑可以回复我~ 2021-12-30 10:41:40
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信