在每个线程里加个sleep(1)试试,以前我做多线程取随机数,经常取到相同的。加上这个就OK

解决方案 »

  1.   

    to:treeroot(根根)
    不好意思,同步方法怎么被共享啊?
      

  2.   

    to:denghan(很久没来ASP版了) 
    我已经加了Thread.sleep(5)了,还是没有用啊!
      

  3.   

    class MyObject{
        public synchronized Hashtable analyse(String str){}
    }class MyThread extends Thread{
        private MyObject obj=new MyObject();
        public void run(){
              //这里访问的是这个线程私有的MyObject对象,各个线程之间没有关系
        }
    }
    这样上面的方法同步当然是没有用的,通过三种情况修改
    1.public synchronized Hashtable analyse(String str){}
      前加上static,这个方法对类同步
    2.private MyObject obj=new MyObject();
      前面加static,线程共享一个实例
    3.另外一种情况就是
    class MyThread extends Thread{
        private MyObject obj;
        public MyThread(MyObject obj){this.obj=obj;}
        public void run(){
              //这里访问的是这个线程私有的MyObject对象,各个线程之间没有关系
        }
    }
    然后也可以共享一个实例
    MyObject o=new MyObject();
    Thread t1=new MyThread(o);
    Thread t2=new MyThread(o);
    .....
    t1.start();t2.start();...
      

  4.   

    to: treeroot(根根) 
    你好!我是实现的runnable方法做线程的。试了你的方法,在analyse方法前加了static还是没用避免重名的现象!
      

  5.   

    to: febchen() 
    随机数我怕重复啊!如果线程多了。几千个并发,难免会重名吧?
      

  6.   

    程序运行checkmessage.java等待队列里面的消息:
    public class CheckMessage
    {
      public static void main(String[] args)
      {
        try
        {
          while (true)
          {
            
            
            //此处省略了一段代码,程序设置了一个队列等待消息,如果有消息进入队列则新建一个线程去处理
            
            if (queue.getCurrentDepth()!=0)
            {
              new Thread(new Responder()).start();
              Thread.sleep(100);
            }
            else
            {
              Thread.sleep(100);
            }
            
          }
        }
        
        catch(Exception e)
        {
          e.printStackTrace();
        }
      }
    }如果有消息了,就调用responder.java处理。
    public class Responder implements Runnable
    {
      public void run()
      {
        try
        {
                 //解析字符串
            AnalyzeXML analyzeXml = new AnalyzeXML();
            Hashtable msgHash = analyzeXml.analyse(msgString);
            String orderStr = msgHash.get("commandtype").toString();
      
     
     
        catch(Exception e)
        {
          e.printStackTrace();
        }
      }}
    然后调用AnalyzeXML.java来保存文件。更奇怪的是我用了随机数还是会有同名文件!public class AnalyzeXML 
    {
      public  synchronized Hashtable analyse(String str)
      {
        try
        {
          ResourceBundle rb = ResourceBundle.getBundle("Source");
          String tempXmlFile = rb.getString("TempXmlFile").trim();
          //Thread.sleep(5);
          //Date today = new Date();
          //Thread.sleep(5);
          Random r = new Random();
          int i = r.nextInt(1000000000);
          SimpleDateFormat df = new SimpleDateFormat("yy.MM.dd_HH.mm.ss.SSS");
          
          String newpath = tempXmlFile.substring(0,tempXmlFile.length()-4) + df.format(new Date()) + String.valueOf(i)+".xml";
          
          System.out.println("~~~~~~~~"+newpath);
          
        }
        catch(Exception e)
        {
          System.out.println(e);
        }
        return ht;
      }}
      

  7.   

    to: treeroot(根根)
    啊?那该怎么解决呢??????????
      

  8.   

    同步问题,上面已经说过,对于随机数不要每次都重新生成种子,可以这样
    private static Random r=new Random();
    ..........{
       int i=r.nextInt();
    }
      

  9.   

    得到线程的HashCode,这样就不会相同了。
      

  10.   

    to: treeroot(根根)
    我把public  synchronized Hashtable analyse(String str)方法加上static还是没有用。比如100个线程并发总会出现99个不同文件。有两个文件会重名。
      

  11.   

    this.sleep(1)和Thread.sleep(1)的含义不一样!
      

  12.   

    补充一下: 或加上线程的hashcode.
      

  13.   

    没仔细看程序,总觉得这样不是办法,应为你是要区分上千个文件
    总要一个区分因子,这和线程是否同步没什么关系(同步可能用在其他方面),当然随机数也会重的。如果考虑在生成线程的时候给他一个数如何?
    比如long i,i是递增的,i的上限比如说是10000,到了10000再从0开始,然后和日期结合,这样保证在同一毫秒内最多有10000个不相同的i的文件,不同时间i相同是没有关系的。
    如果10000不够可以再加。import java.util.*;
    import java.text.*;
    import java.math.*;public class Filenames extends Thread{
      public int i;
      public Filenames(int i){
       this.i=i;
      }
      
      public void run(){
      
       analyse("test",i);
      
      }  public  void analyse(String str,int i)
      {
      
        try
        {
          //ResourceBundle rb = ResourceBundle.getBundle("Source");
          String tempXmlFile ="textFile";// rb.getString("TempXmlFile").trim();
          //Thread.sleep(5);
          Date today = new Date();
          //Thread.sleep(1000);
          
          SimpleDateFormat df = new SimpleDateFormat("yy.MM.dd_HH.mm.ss.SSS");
          
          String newpath = tempXmlFile.substring(0,tempXmlFile.length()-4) + df.format(today)+i +".xml";
          
          System.out.println("~~~~~~~~"+newpath);
         }catch(Exception e){
          e.printStackTrace();
         }
      
       }
       
       public static void main(String a[]){
       int i;
        Filenames[] getFn=new Filenames[100];
       for(i=0;i<100;i++){
       getFn[i]=new Filenames(i);
       getFn[i].start();
       }
       }
       
    }
      

  14.   

    谢谢各位的帮助!尤其是 treeroot(根根)和 febchen() 两位DX!多谢多谢!分已经全部送上!