La copia profunda resuelve el problema de la superposición de datos entre subprocesos (registro de evitación de pozos)

introducir

Hay un requisito tan pequeño:

  • Hay 500 tareas, primero divida estas 500 tareas en grupos de 50, luego se puede dividir un total de 10 grupos. Luego, coloque estos 10 grupos de tareas en el grupo de subprocesos (actualmente hay 10 grupos de tareas en el grupo de subprocesos)
  • El grupo de subprocesos procesa estos diez grupos de tareas por separado.

El pseudocódigo escrito es el siguiente:

		array = 500个任务;
		JSONArray perThread = new JSONArray();
		int count = 0;
        for(int i = 0; i < 10; i++){
    
    
            //积攒50个一组,攒满了就开一个线程。
            for(50){
    
    
				perThread.add(array.get(count));
				count++;
			}
            
            if (perThread.size() == 50) {
    
    
            	//下面一行代码是启动一个线程池中的线程,执行每一组(50个)任务
                threadPool.submit(()->sendOpenAPI(perThread));
                //清空该组,重新填充。
                perThread.clear(); 
            }
        }

Piense detenidamente en lo que está mal con el código anterior.

analizar problema

Una referencia de objeto (es decir, la variable perThread) se pasa al subproceso secundario. Cuando el subproceso secundario se está ejecutando, el subproceso principal no se bloqueará, sino que continuará ejecutándose. ejecutar a

perThread.clear()

En esta línea de código, se borra la referencia del objeto (perThread). Luego, perThread en el subproceso secundario desaparece. Esto también se ocupa del cabello. . . .

solución

El uso de una copia profunda resuelve este problema. Adapte ese bloque de código de la siguiente manera:

				if (perThread.size() == 50) {
    
    
				//开新线程。
                JSONArray deepCopy = new JSONArray();   //对原来的对象进行深拷贝。
                BeanUtils.copyProperties(perThread,deepCopy);
                threadPool.submit(()->sendOpenAPI(deepCopy));

                perThread.clear();  //放心清空即可,反正已经将深拷贝后的东西传入子线程了
                
                }

Usando la copia profunda, se usa una nueva referencia de objeto en el subproceso secundario. Incluso si la referencia del objeto original se vacía en el subproceso principal, el objeto no se vaciará porque hay un nuevo espacio de memoria en el subproceso secundario.

problema resuelto.

Supongo que te gusta

Origin blog.csdn.net/weixin_44757863/article/details/122378799
Recomendado
Clasificación