gpt4 book ai didi

java - 多线程执行顺序

转载 作者:行者123 更新时间:2023-11-30 08:13:58 25 4
gpt4 key购买 nike

我在理解为什么当我多次创建一个实现可运行接口(interface)的对象时遇到一些问题,并且当我调用该对象 start()< 时在 @Test 上创建它们 它首先运行 @Test,然后如果对象存在,则执行 run 方法。

这是代码:

public class Tests extends {
@Test(testName = "754")
public void concurrenciaGuardarArticuloTMP() throws Exception {
try {
this.codigoBarras =this.generarCodigoDeBarra();
System.out.println(codigoBarras);
logger.info("Codigo de barras generado fue ::: " + codigoBarras);
GuardarArticuloTMP articulo1 = new GuardarArticuloTMP(GuardarArticuloTMP.TMP.TMP_CODIGO_BARRA,"TMP, Hilo 1", codigoBarras,35);
GuardarArticuloTMP articulo2 = new GuardarArticuloTMP(GuardarArticuloTMP.TMP.TMP_CODIGO_BARRA,"TMP, Hilo 2", codigoBarras,37);
articulo1.start();
articulo2.start();
logger.info("Codigo de barras generado fue ::: " + codigoBarras);
System.out.println("Codigo de barras generado fue ::: " + codigoBarras);
logger.info(writeDTO(articulo1.getArticulo()));
} catch (Exception ex) {
logger.error("Error guardando Articulo.", ex);
this.setExecutionDetail(ex.getMessage());
}
}
}

和 GuardarArticulos 类:

public class GuardarArticuloTMP extends Setup implements Runnable{

private Thread t;
private String threadName;
private String codigoBarras;
private int numeroCaja;
private static Logger logger = Logger.getLogger(GuardarArticulo.class);

/**
* @param pThreadName nombre del hilo
* @param pCodigoBarras codigo de barras
* @param pNumeroCja numero de caja para el local
*/
public GuardarArticuloTMP(TMP tmp, String pThreadName, String pCodigoBarras, int pNumeroCja) {
this.threadName = pThreadName;
this.codigoBarras = pCodigoBarras;
this.numeroCaja = pNumeroCja;
this.tmp = tmp;
initLogger();
}

/**
* Crea un articulo
* @return nos devuelve un articulo
* @throws Exception
*/
private ArticuloFacadeDTO crearArticulo() throws Exception {
//creates Articulo
return toSave;
}

@Override
public void run() {
System.out.println("Corriendo " + this.threadName.toUpperCase() + " !!!!!!!!!!!!!!!!!!!!!!!!");
logger.info("Corriendo " + this.threadName.toUpperCase() + " !!!!!!!!!!!!!!!!!!!!!!!!");
try{
Thread.sleep(50);
logger.info("estoy en el run por crear el articulo");
ArticuloFacadeDTO toSave = crearArticulo();
writeDTO(toSave);
mgr.guardarArticuloFacade(toSave);
Thread.sleep(50);
}catch(Exception ex) {
ex.printStackTrace();
logger.error("Error::: ",ex);
}
}

public void start()
{
logger.info("Empezado el thread " + this.threadName);
if (t == null) {
t = new Thread (this, threadName);
t.setPriority(10);
t.start();
}
}

}

我期望的是,在调用所有 starts() 后,它会在线程上启动,然后完成运行 @Test 方法,因此我将我需要验证。

最佳答案

如果使用Runnable接口(interface),Java多线程中没有执行顺序。无法保证 articulo1 会在 articulo2 之前完成。

@Test 的问题:它在单独的线程上运行,因此测试方法在 Runnable 完成之前很久就完成了。

我建议你认真读一下官方的Concurrency Oracle 网页上的踪迹。

关于java - 多线程执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29922461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com