要写一个多线程程序,并发来访问某个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截取的字符串有时候少了<,绝大部分是没问题的,这个问题太奇怪了。