程序是,从HTML写数据,通过javaservlet接收数据,传给Java的一个对象处理数据。
我想是,java对象处理完一个数据之后,再处理下一个。
但是如果HTML里写数据过快,则java对象再未处理完这个数据时,接收到新数据交叉或者混乱的顺序处理新来的数据。
public void run() {
synchronized (this.charthreshold) {
if(index==0){  //Determine the end of this array
index=1;
System.out.println("***************************THREAD START: "+index);
//java对象,处理数据

    System.out.println("***************************THREAD END");
    index=0;
}

}
}
但是,这样子改了之后,通过thread限制。但是问题是,数据并不是按照HTML写的顺序进入java处理对象的。比如HTML写的是1,2,3,4,5,6,7,...。通过thread传递给java对象的却是1,2,4,5,7,3,...请问原因是什么,该如何处理?Java线程

解决方案 »

  1.   

    当前对象获取到锁后,处理完数据,锁就要归还,如果当前有多个任务在等待这个锁,下一次谁再获取到锁java内部机制里面并没有保证,所以造成了数据混乱了。
    可以采用自定义一个锁来控制。
    public void run() {       
        if (!locked) {
            locked = true;
            if(!statck.isEmpty()){  //栈里面如果数据不为空则数据从栈里面取.
                                   //这样就可以保持数据保存的顺序是正确的了。
                data = statck.getData();
              }
            if(index==0){  //Determine the end of this array
                index=1;
                System.out.println("***************************THREAD START: "+index);
                //java对象,处理数据   
                 //数据在data 中
                System.out.println("***************************THREAD END");
                index=0;
            }
          locked = true;
             
        }else{
           statck.saveData(data);//当前有数据正在处理,将数据保存在一个堆栈里面
        }
    }
    //上面只是个大致思路,可以参考下。
      

  2.   

    没必要显式的加锁,首先servlet接收的请求并不是顺序的,也就是说并发的,因此谁抢到锁谁就先执行。如果你要保证顺序的话,那么第一个你在后台的处理那个业务类与servlet之间加一个线程安全的队列,这和加锁差不多(也不是绝对的顺序),但是实现比较麻烦,因为你如果有返回值的话,还要wait/notify。第二个,绝对的顺序需求一般是由业务要求的,比如按时间先后排,那么你就要把这个队列改造成有序队列...也还好了,不是很麻烦.队列的元素加个包装类(提供wait/notify),免得入侵了业务对象。
      

  3.   

    从HTML写数据,通过javaservlet接收数据(按顺序接收数据),传给Java的一个对象处理数据。然后再返回值给HTML。
      

  4.   

    非常符合,谢谢,但是“这个队列改造成有序队列”,这个不是很清楚。
    1.是在HTML里添加有序队列?
    2.用什么方式?数组或者其他?
    因为要求速度,添加有序队列是否需要排序?