不多废话,先说说代码片断,有三个类: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循环外面也打印不出来。
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循环外面也打印不出来。
public static void main(String[] args) {
new X().start(); //TX线程
new Y().start(); //TZ线程
}
}
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();
}
}
}
}
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();
}
}
}
}
for (Iterator iter = qa.entrySet().iterator(); iter.hasNext();) {
Z线程取的时候也要Collections.synchronizedMap(.Queue_A);才行
ConcurrentHashMap是部分代码段同步。你的两个线程,一个读一个写,看上去,使用ConcurrentHashMap应该能够满足,没有问题。