sundianzhe
sundianzhe
2017-06-20 06:24
采纳率: 100%
浏览 2.7k
已采纳

java 多线程中每个线程中new一个对象使用还是有问题,各位大神帮忙看看,什么原理

-//代码如下,启动多个线程,每个线程线程中 new Test1 使用,但是在Test1 的方法中打印大概率中存在重复的输入,请问这是为什么?
package com;

import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class Test2 {
public static void main(String[] args){
//System.out.println(System.getProperty("java.version"));
//System.out.println(Math.random());
final String xmlhead1="xmlhead1";
final String xmlbody1="xmlbody1";

 final String xmlhead2="xmlhead2";
 final String xmlbody2="xmlbody2";
ExecutorService exec = Executors.newCachedThreadPool(); 
final Semaphore semp = new Semaphore(5); 

for (int index = 0; index < 1000; index++) {
Runnable run = new Runnable() {
public void run() {
try {
// 获取许可
semp.acquire();
if(Math.random()>=(0.5)){
Test1 testone=new Test1();
//synchronized (testone){
testone.parseString(xmlhead1, xmlbody1);
//}
}
else{
Test1 testtwo=new Test1();
//synchronized (testtwo){
testtwo.parseString(xmlhead2, xmlbody2);
//}
}
semp.release();
}catch(Exception e){
e.printStackTrace();
}
}
};
exec.execute(run);
}
exec.shutdown();

}

}
class Test1 {
public String parseString(String head,String body){
System.out.println("parseString:"+this.toString());
return head+body;
}
}

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • strutce
    丵鹰 2017-06-20 07:02
    已采纳

    内存地址的分配与垃圾回收的,

    点赞 评论
  • wal1314520
    wal1314520 2017-06-20 07:05

    不知道我理解你的问题是否正确,你是不是想问为什么打印的结果1,2不是顺序呢来的?而是一会儿1一会儿2或者一堆1再一堆2?
    这个是多线程没有进行自主控制,是由操作系统的任务调度执行的,不能改善,可以人为的控制线程;你如果想要顺序的打印出结果,可以
    使用synchronized(线程互斥)与wait(),notify()来配合完成顺序打印出结果。
    如果你想问的不是这个,请把问题说的再详细点,我可以给你进一步的解答,谢谢!

    点赞 评论

相关推荐