weixin_42331632 2009-08-05 14:26
浏览 232
已采纳

java多线程同步的问题,请大家帮忙看下

要写一个多线程程序,并发来访问某个URL做模拟测试,但是遇到了几个奇怪的问题,
[code="java"]public class MyThread extends Thread {
static Logger logger = Logger.getLogger(MyThread.class);
int number;
long count = 1;
static String contentString = 0000RINPRINP20090715120130004 //FeeConfig.getConfigMap("./src/com/test/fee.config");

public MyThread(int num) {
    number = num;
    logger.debug("创建线程 " + number);
}

@Override
public void run() {
    try {
        while (true) {
            long startTime = System.currentTimeMillis();

            startTime = System.currentTimeMillis();
            long counter = Util.getCounter();

             int index1 = contentString.indexOf("<TransIDC>");
            int index2 = contentString.indexOf("</TransIDC>");
            // logger.debug("index1:" + index1 + "   index2:" + index2);
            String tempString1 = contentString.substring(0, index1 + 10);
            String tempString2 = contentString.substring(index2);
                            // contentString =
            // contentString.replace("0000RINPRINP20090715120130004",
            // String.valueOf(counter));
            contentString = tempString1 + counter + tempString2;
            logger.debug("counter:" + String.valueOf(counter));

            String response = HttpPost.doHttpPost(contentString);

             long endTime = System.currentTimeMillis();
             if (response != null && response.length() > 0) {
                 // logger.debug(response);
                 logger.debug("线程 " + number + ":计数 " + String.valueOf(counter) + " get response:使用时间:" + String.valueOf(endTime - startTime));

            }
            if (++count == 21) {
                return;
            }
            Thread.sleep(1000);
        }
    } catch (Exception e) {
        logger.error(e);
        e.printStackTrace();
    }
}

public static void main(String args[]) {
    PropertyConfigurator.configure(MyThread.class.getResource("/log4j.properties"));

    for (int i = 0; i < 20; i++) {
        new MyThread(i + 1).start();
    }

}

}[/code]

我要用序号代替0000RINPRINP20090715120130004 里面的内容,遇到了下面几个问题:
1, 我用replace方法contentString.replace("0000RINPRINP20090715120130004",String.valueOf(counter));
虽然在前面打印出counter的值是正确的,但是执行上面的方法后,里面都是1,于是我改成了先截取,然后再截取出,最后拼接起来,结果绝大部分时候是正确的,但是偶尔有几个少了中的<,成了类似 101/TransIDC>,
2. 虚拟机能保证java的每个线程都能执行吗?因为看到在打出来的Log中,有的线程好像没有执行,会不会说起的线程太多了,某个线程一直得不到资源,就不能执行,一段时间以后就销毁了。
请大家帮忙看一下原因。

[code="java"]public class Util {
static long counter = 0;

synchronized public static long getCounter() {
    counter++;
    return counter;
}

}[/code] 这个是生成计数的方法。

[b]问题补充:[/b]
谢谢foy的解答,使我明白了不能通过replace达到目的的原因,
还有问题需要大家的解答, 就是有的时候通过subString截取的字符串有时候少了<,绝大部分是没问题的,这个问题太奇怪了。

  • 写回答

4条回答 默认 最新

  • ljs2342003 2009-08-05 17:46
    关注

    1.第1个线程跑过这句后,contentString就会变成1,以后线程在执行下面的替换语句时就什么也不会替换了。
    [code="java"] contentString = contentString.replace("0000RINPRINP20090715120130004", String.valueOf(counter)); [/code]
    2.没个线程理论上来说都是会执行。。并且你这个线程应该是一直会跑下去

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 用PLC设计纸袋糊底机送料系统
  • ¥15 simulink仿真中dtc控制永磁同步电机如何控制开关频率
  • ¥15 用C语言输入方程怎么
  • ¥15 网站显示不安全连接问题
  • ¥15 github训练的模型参数无法下载
  • ¥15 51单片机显示器问题
  • ¥20 关于#qt#的问题:Qt代码的移植问题
  • ¥50 求图像处理的matlab方案
  • ¥50 winform中使用edge的Kiosk模式
  • ¥15 关于#python#的问题:功能监听网页