有没有大神在线程任务中使用过集合的forEach方法?

DDF_YiChen 2018-05-02 03:59:08
class syncMapTask implements Runnable {
private static Map<String, Object> map = Collections.synchronizedMap(new HashMap<>());
private Lock lock = new ReentrantLock();

static {
map.put("AAA", "AAA");
map.put("BBB", "BBB");
map.put("CCC", "CCC");
}

@Override
public void run() {
lock.lock();
String random = new Random().nextInt() + "";
try {
System.out.println("before............");
/* for (Map.Entry<String, Object> m : map.entrySet()) {
System.out.print(Thread.currentThread().getName() + "取出: " + m.getKey() + ":" + m.getValue());
}*/

/**
* 不晓得这一行为什么会失效,如果不再线程任务中,却是可以正常循环出来,这里如果使用了forEach,
* 看起来会直接终止所有的线程任务一样,后面的代码和线程再也不会执行,直接程序终止了。。。。。
*
*/
// map.forEach((k, v) -> System.out.println(Thread.currentThread().getName() + "取出" + k + "v"));
map.forEach((k, v) -> System.out.println(k + "v"));
System.out.println(",存入" + random);
map.put(random, random);
} finally {
lock.unlock();
}
}
}
如上是一个简单的线程任务类,加入线程执行后,如果使用增强for循环,代码应该是没有问题的,各个线程都能够顺利执行读取最新的map里面的值,可是如果循环使用了forEach方法,则控制台打印以下before...之后,线程任务就像死了一样的,然后就程序执行结束,控制台上什么都没有,forEach之后的代码也打印不了了,请问有大神知道这是为什么吗?
...全文
668 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
DDF_YiChen 2018-05-04
  • 打赏
  • 举报
回复
引用 楼主 yichen0429 的回复:
class syncMapTask implements Runnable { private static Map<String, Object> map = Collections.synchronizedMap(new HashMap<>()); private Lock lock = new ReentrantLock(); static { map.put("AAA", "AAA"); map.put("BBB", "BBB"); map.put("CCC", "CCC"); } @Override public void run() { lock.lock(); String random = new Random().nextInt() + ""; try { System.out.println("before............"); /* for (Map.Entry<String, Object> m : map.entrySet()) { System.out.print(Thread.currentThread().getName() + "取出: " + m.getKey() + ":" + m.getValue()); }*/ /** * 不晓得这一行为什么会失效,如果不再线程任务中,却是可以正常循环出来,这里如果使用了forEach, * 看起来会直接终止所有的线程任务一样,后面的代码和线程再也不会执行,直接程序终止了。。。。。 * */ // map.forEach((k, v) -> System.out.println(Thread.currentThread().getName() + "取出" + k + "v")); map.forEach((k, v) -> System.out.println(k + "v")); System.out.println(",存入" + random); map.put(random, random); } finally { lock.unlock(); } } } 如上是一个简单的线程任务类,加入线程执行后,如果使用增强for循环,代码应该是没有问题的,各个线程都能够顺利执行读取最新的map里面的值,可是如果循环使用了forEach方法,则控制台打印以下before...之后,线程任务就像死了一样的,然后就程序执行结束,控制台上什么都没有,forEach之后的代码也打印不了了,请问有大神知道这是为什么吗?
最终结果应该是我使用了Junit4来运行的程序,使用Junit5是正常的。也是奇怪,junit4单独跑forEach没有问题,但是在线程里跑forEach就有问题。
DDF_YiChen 2018-05-03
  • 打赏
  • 举报
回复
引用 1 楼 jc890904 的回复:
没有复现你的问题
引用 1 楼 jc890904 的回复:
没有复现你的问题
好像是因为我启动线程的代码是用junit写的,没有主线程,如果在主线程中启动线程任务使用forEach没有问题,但是如果不在主线程中启动线程任务,forEach就有问题。
DDF_YiChen 2018-05-03
  • 打赏
  • 举报
回复
引用 楼主 yichen0429 的回复:
class syncMapTask implements Runnable { private static Map<String, Object> map = Collections.synchronizedMap(new HashMap<>()); private Lock lock = new ReentrantLock(); static { map.put("AAA", "AAA"); map.put("BBB", "BBB"); map.put("CCC", "CCC"); } @Override public void run() { lock.lock(); String random = new Random().nextInt() + ""; try { System.out.println("before............"); /* for (Map.Entry<String, Object> m : map.entrySet()) { System.out.print(Thread.currentThread().getName() + "取出: " + m.getKey() + ":" + m.getValue()); }*/ /** * 不晓得这一行为什么会失效,如果不再线程任务中,却是可以正常循环出来,这里如果使用了forEach, * 看起来会直接终止所有的线程任务一样,后面的代码和线程再也不会执行,直接程序终止了。。。。。 * */ // map.forEach((k, v) -> System.out.println(Thread.currentThread().getName() + "取出" + k + "v")); map.forEach((k, v) -> System.out.println(k + "v")); System.out.println(",存入" + random); map.put(random, random); } finally { lock.unlock(); } } } 如上是一个简单的线程任务类,加入线程执行后,如果使用增强for循环,代码应该是没有问题的,各个线程都能够顺利执行读取最新的map里面的值,可是如果循环使用了forEach方法,则控制台打印以下before...之后,线程任务就像死了一样的,然后就程序执行结束,控制台上什么都没有,forEach之后的代码也打印不了了,请问有大神知道这是为什么吗?
经过一楼测试提醒发现,这个问题出现在不在主线程中启动任务。本人使用的Junit来测试的代码。非main函数
傻傻de点点 2018-05-02
  • 打赏
  • 举报
回复

没有复现你的问题
傻傻de点点 2018-05-02
  • 打赏
  • 举报
回复

没有复现你的问题

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧