ResultSet rs=c.executeQuery("SELECT * from table");
while(rs.next()){
          executorservice.execute(new Handler(rs.getString(1)));
    }class Handler implements Runnable{
      public Handler(String s){             this.msg=s;
       }      ...
     Socket socket=new Socket("127.0.0.1",8888);
      socket.println(msg);
   }大致代码如此,每从数据库读到一条数据就进行发送,由于考虑到后台支持多线程接收,为提高效率,想把发送也做成多线程。可测试过程中出现了数据重复发送的情况,而且出现没规律。这是什么问题呢??
望各位帮忙~~~

解决方案 »

  1.   

    你的thread start在哪?
    Socket socket=new Socket("127.0.0.1",8888);
    socket.println(msg);
    这两行又是在哪?
      

  2.   


    用的executorservice线程池    只需要继承runnable接口  这里用的Handler继承    用executorservice.execute(new Handler())就可以启用子线程   由executorservice去调用start,我不用关心socket发送代码是在继承了runnable接口的函数里的(例子里是Handler)   就是每个子线程所做的事就是发送socket报文
      

  3.   


    发送过程并不会耗时很多,可是后台处理需要一定时间,后台可以多线程处理,所以想把发送做成多线程的,曾经测试过1000多条数据单线程后台要处理半个小时,所以想做成多线程加快处理效率。我这里从数据库取数据并没有多线程,是取到以后丢给Handler去处理,取到一个就丢,测试的时候效率是快多了,可是会时不时出现重复数据。
      

  4.   


    实际程序中的 SQL 是用了 dinstinct   也把所有数据打印出来查了 没有重复的~~~~~~~~~我现在给ResultSet加了个synchronized试一下看   可这样我估计对速度影响不小 估计跟单线程差不多了
      

  5.   

    效果应该不大,可以debug下ResultSet rs=c.executeQuery("SELECT * from table");,看是否是多次执行了,如何不是异步的,就放在static块中
      

  6.   

    不是设计的原因,是子线程代码中的BUG~~~~~~~