不多废话,先说说代码片断,有三个类:1)MainProcess类
public class MainProcess{
public static ConcurrentHashMap Queue_A; //处理队列A  public void start(){
new X().start(); //TX线程
new Z().start(); //TZ线程
}
。2)线程X
public class X extends Thread{
public void run(){
while(true){
  System.out.println("insert...");
  MainProcess.Queue_A.put(key, r);
  
  sleep(20);
。3)线程Z
public class Z extends Thread{
public void run(){
while(true){
  ConcurrentHashMap qa = MainProcess.Queue_A;
  System.out.println("process...");  for (Iterator iter = qa.entrySet().iterator(); iter.hasNext();) {
Map.Entry entry = (Map.Entry) iter.next();
String key = (String)entry.getKey();
      sleep(5);  。  我的想法很简单,运行两个线程,X线程不停的往Queue_A里添加数据,Z线程每次从队列中取得当前所有数据,然后循环执行处理逻辑。问题出来了:每次刚运行时一切正常输出日志如下:
insert...
insert...
insert...
process...
insert...
process...
process...
insert...
但跑一会(时间随机),日志就变成:
insert...
insert...
insert...
insert...
insert...
貌似Z线程执行不了,“process...”打印不出来,只能打印出"insert...";
就算我把System.out.println("process...");放在for循环外面也打印不出来。

解决方案 »

  1.   

    我给你看了下,下面是我写的,没问题。还有你模拟这个程序的目的是?package test.concurrentHashMap;import java.util.concurrent.ConcurrentHashMap;public class MapTest { public static ConcurrentHashMap Queue_A=new ConcurrentHashMap();
    public static void main(String[] args) {
    new X().start(); //TX线程
    new Y().start(); //TZ线程
    }
    }
      

  2.   


    package test.concurrentHashMap;public class X extends  Thread{

    @Override
    public void run() {
    while(true){
    System.out.println("insert");
    MapTest.Queue_A.put("d", "dd");
    try {
    sleep(20);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
    }
      

  3.   


    package test.concurrentHashMap;import java.util.Iterator;
    import java.util.Map.Entry;
    import java.util.concurrent.ConcurrentHashMap;public class Y extends Thread{ @Override
    public void run() {
    // TODO Auto-generated method stub
    while(true){
      ConcurrentHashMap qa = MapTest.Queue_A;
     
      try {
    sleep(5);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
      for (Iterator iter = qa.entrySet().iterator(); iter.hasNext();) {
      System.out.println("process...");
      Entry entry = (Entry) iter.next();
      String key = (String)entry.getKey();
    }
    }
    }
    }
      

  4.   

    晕....为啥我运行起来就打印不出"process..."
      

  5.   

    补充:我把下面这段迭代去掉后,就能打印出"Process..."
    for (Iterator iter = qa.entrySet().iterator(); iter.hasNext();) {
      

  6.   

    你这个问题;我遇到过,LZ   在X线程里加入的时候一定要同步Collections.synchronizedMap(.Queue_A);
    Z线程取的时候也要Collections.synchronizedMap(.Queue_A);才行
      

  7.   

    Collections.synchronizedMap是让对象访问完全同步。
    ConcurrentHashMap是部分代码段同步。你的两个线程,一个读一个写,看上去,使用ConcurrentHashMap应该能够满足,没有问题。