java为什么多线程往一个list中放值,但是放值的个数每次都不一样为什么

hahawo110 2016-09-05 09:44:12
package app.ThreadApplication;

import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class MyThread extends Thread {
private Map<String, Object> compareMap;
private List<Object> list;
public MyThread(Map<String, Object> compareMap,List<Object> list ){
this.compareMap = compareMap;
this.list=list;
}
public void run() {
// System.out.println("aaaaaaaaaa");
Iterator<Entry<String, Object>> iterator = compareMap.entrySet().iterator();

while (iterator.hasNext()) {
Entry<String, Object> entry = iterator.next();
if ("20".equals(entry.getKey())) {
list.add(true);
}
}
}
}



package app.ThreadApplication;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class Main {

public static void main(String[] args) {



Map<String, Object> compareMap = new HashMap<String, Object>();
for (int i = 0; i < 100; i++) {
compareMap.put(String.valueOf(i), i);
}
List<Object> list = new ArrayList<Object>();

long start = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
Thread thread1=new MyThread(compareMap,list);
thread1.start();

}

long end = System.currentTimeMillis();
System.out.println((end - start) / 1000.00);
System.out.println(list.size());

}
}
...全文
584 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_36100887 2016-09-10
  • 打赏
  • 举报
回复
Arraylist线程是不安全的,你可以尝试给list加上同步,或者像楼上一样的进行安全转换这样应该就可以了
青衣布简 2016-09-09
  • 打赏
  • 举报
回复
ArrayList 线程不安全 将它序列化就可以了··· List list=Collections.synchronizedList(new ArrayList());
NewMoons 2016-09-09
  • 打赏
  • 举报
回复
2楼说的很对,main中的代码本身也是一个线程,我们称之为进程下的主线程。所有线程执行的时间和代码的顺序无关(否则也不存在线程同步一说了),所以说放在后面的代码未必会等到前面的线程执行完后才执行。 我把你的代码修改了下,你看下输出的提示(多运行几次看看)就明白了。
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class MyThread extends Thread {
	private Map<String, Object> compareMap;
	private List<Object> list;

	public MyThread(Map<String, Object> compareMap, List<Object> list) {
		this.compareMap = compareMap;
		this.list = list;
	}

	public void run() {
		// System.out.println("aaaaaaaaaa");
		Iterator<Entry<String, Object>> iterator = compareMap.entrySet().iterator();

		while (iterator.hasNext()) {
			Entry<String, Object> entry = iterator.next();
			if ("20".equals(entry.getKey())) {
				list.add(true);
				System.out.println("我子线程还没执行完呢!");
			}
		}
	}
}
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {

	public static void main(String[] args) {

		Map<String, Object> compareMap = new HashMap<String, Object>();
		for (int i = 0; i < 100; i++) {
			compareMap.put(String.valueOf(i), i);
		}
		List<Object> list = new ArrayList<Object>();

		long start = System.currentTimeMillis();
		for (int i = 0; i < 100; i++) {
			Thread thread1 = new MyThread(compareMap, list);
			thread1.start();
		}

		long end = System.currentTimeMillis();
		System.out.println((end - start) / 1000.00);
		System.out.println("主线程执行完毕,结果是:" + list.size());

	}
}
hahawo110 2016-09-08
  • 打赏
  • 举报
回复
还有说以为线程先后顺序的问题,我试过DEBUG在System.out.println(list.size());这句话上,也就想保证所有线程都跑完的情况下看看LIST是不是丢失数据,然而还是会丢失数据,有的时候是99有的时候是100
hahawo110 2016-09-08
  • 打赏
  • 举报
回复
我还是不明白?进程下的所有线程不都是运行在一个CPU下的么?这样其实在CPU一个时间片中其实还是跑的一个线程,这样不还是一个线程一个线程往LIST里面追加数据,那为什么上面的代码还是丢失数据那
活溪丶 2016-09-06
  • 打赏
  • 举报
回复
list线程不安全 肯定是每次个球不一样
Alvis_you 2016-09-06
  • 打赏
  • 举报
回复
你这个问题太基础了,你多线程操作,主线程也是个线程,你新建的线程根本没执行完就执行主线程了所以导致每次数不一样,你主线程 Thread.sleep(200); 再试试
活溪丶 2016-09-06
  • 打赏
  • 举报
回复
线程运行是由系统操作的

62,625

社区成员

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

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