采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
如果线程不是new Runnable()而是使用lambada的话三次都会调用计算不走缓存,怎么回事呢?就是重复计算问题没解决,
可以看下这个思路:http://coding.imooc.com/learn/questiondetail/2vGBE6xZZA9YNkaq.html
lambada的并行,如果里面用的是同一个expensiveComputer实例,那么和new Runnable()是一致的。lambada有自己的线程池。
用的是同一个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调用了计算函数”?
这个我试过了,不是lambda表达式的问题,如果用Runnable对象同样可能有重复计算问题,因为大家是同一时间去做的compute,而且667用不上666的缓存。你试一下在第3次计算前,sleep一下,就会发现,不会重复计算了。
登录后可查看更多问答,登录/注册
JUC全方位讲解,构建并发工具类知识体系
961 11
1.4k 10
993 10
976 10
1.4k 9