有一个map,创建100个进程,向里面加元素,又创建了200个进程,减元素,怎么实现同步,组后总是不能输出800
该怎么实现
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestMultiThread{
? ?public static Map<String,Vector<String>> map = new HashMap<String,Vector<String>>();
? ?public static void main(String[] args) {
? ? ? ?ExecutorService executor = Executors.newCachedThreadPool();
? ? ? ?for(int i = 0 ; i < 1000; i++){
? ? ? ? ? ?executor.execute(new AddMap(“username”,”asd”,map));
? ? ? ? ?}
? ? ? ?for(int i = 0 ; i < 200; i++){
? ? ? ? ? ? ? ?executor.execute(new DeleteMap(“username”,”asd”,map));
? ? ? ?}
? ? ? ?executor.shutdown();
? ? ? ?while(!executor.isTerminated());
? ?}
? ?public static void mapSize(String username){
? ? ? ?System.out.println(map.get(username));
? ? ? ?System.out.println(map.get(username).size());
? ?}
}
class AddMap extends Thread{
? ? ?public Map<String,Vector<String>> map = new HashMap<String,Vector<String>>();
? ? ?private String username;
? ? ?private String value;
? ? public AddMap(String username,String value,Map<String,Vector<String>> map){
? ? ? ? ? ? ?this.username = username;
? ? ? ? ? ? ?this.value = value;
? ? ? ? ? ? ?this.map = map;
? ? ?}
? ? ?public void run(){
? ? ? ? ? ?synchronized(map){
? ? ? ? ? ? ? ? ?addMap(username,value);
? ? ? ? ? ? ? ? ?TestMultiThread.mapSize(username);
? ? ? ? ? ? ? ? ?map.notifyAll();
? ? ? ? ? ? ?}
}
private void addMap(String username,String value){
? ? ? ? ?if(!map.containsKey(username)){
? ? ? ? ? ? ? ? ?map.put(username, new Vector<String>());
? ? ? ? ? ? ? ? ? ?map.get(username).add(value);
? ? ? ? ?}else{
? ? ? ? ? ? ? ? ?map.get(username).add(value);
? ? ? ? ? ? ?}
? ? ? ? try {
? ? ? ? ? ? ? ?Thread.sleep(0);
? ? ? ? ? ? ?} catch (InterruptedException e) {
? ? ? ? ? ? ?// TODO 自动生成的 catch 块
? ? ? ? ? ? ?e.printStackTrace();
? ? ? ? ? ?}
? ? ? ? ?}
}
class DeleteMap extends Thread{
? ? ? ?public Map<String,Vector<String>> map = new HashMap<String,Vector<String>>();
? ? ? ?private String username;
? ? ? ?private String value;
? ? ? ?public DeleteMap(String username,String value,Map<String,Vector<String>> map){
? ? ? ?this.username = username;
? ? ? ?this.value = value;
? ? ? ?this.map = map;
? ? ?}
? ? ? ? ?public void run(){
? ? ? ? ? ? ?synchronized(map){
? ? ? ? ? ? ? ? ? ?if(map == null){
? ? ? ? ? ? ? ? ? ? ? ?try {
? ? ? ? ? ? ? ? ? ? ? ? ? ?map.wait();
? ? ? ? ? ? ? ? ? ? ? ?} catch (InterruptedException e) {
? ? ? ? ? ? ? ? ? ? ? ?// TODO 自动生成的 catch 块
? ? ? ? ? ? ? ? ? ? ? ? ? ?e.printStackTrace();
? ? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ??deleteMap(username,value);
? ? ? ? ? ? ? ? ?TestMultiThread.mapSize(username);
? ? ? ? ? ?}
? ? ? ?}
? ? ? ?private void deleteMap(String username,String value){
? ? ? ? ? ? ?if(map.containsKey(username)){
? ? ? ? ? ? ? ? ? ? ?map.remove(username);
? ? ? ? ? ? ?}
? ? ? ?}
}