ajax 调用后台异步代码问题!
用ajax调用后台代码,成功进入后台。但是调用方法中新启动了一个线程,导致ajax无法返回,怎么解决?
//CODE A
Log.info("*********** 测试1 ***********", "");
new Thread(){
public void run(){
Log.info("*********** 测试2 ***********", "");
}
}.start();
//CODE B
Log.info("*********** 测试3 ***********", "");
代码走到 CODE A 部分就停止了,只打印了“测试1”,导致ajax没有返回!难道ajax不能调用异步代码吗?希望有人帮忙解答一下原因!在线等!
------解决方案--------------------
Thread t = new Thread(){
public void run(){
Log.info("*********** 测试2 ***********", "");
}
}.start();
t.join(); //等待
------解决方案--------------------你开了一个子线程,你的主线程还是在走啊 ,不可能没返回值的 ,哪里有错误吧
------解决方案--------------------ajax没有返回是什么意思?
是指没有callback吗?
只打印了“测试1”
-> 测试2没有打印是可以理解的,
但是测试3没有打印是不正常的,除非之前出了异常,即使在thread中出异常也不会导致测试3没有打印。
t.join();
-> 加上的原因是等待该线程完成后,继续。
想确认
1 到底想什么时候返回ajax回调函数? 测试3打印完还是另外线程方法结束后。
2 因为业务不知道,为什么要异步?要实现什么功能?
------解决方案--------------------那也没什么问题,request线程打印了测试3以后,回归线程池,任务结束,而新建的线程
也会异步的继续执行,如果该线程为非守护线程,他的生命周期就是run方法
逻辑的结束。新建的线程不会随着request线程的结束而结束。
就会有一个问题,就是页面上显示已经完成,但是其实还有一部分的功能还没有实现。最好在新建的线程结束有一个回调。
------解决方案--------------------“测试3”还是没有打印出来,刚刚发现打印出来的“测试3”是我屏蔽掉启动新线程代码时候打印的。。。
-> 那就调试一下,为什么没有打印。有异常没有。
------解决方案--------------------
new Thread(){
public void run(){
Log.info("*********** 测试2 ***********", "");
return;
}
}.start();
肯定阻塞了。
试试下面的
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("*********** 测试2 ***********");
}
});
t1.start();
1 Runnable
2 Log.info -> System.out.println
------解决方案--------------------什么容器?环境 linux, windows?
框架?
------解决方案--------------------jstack -l [pid] > threadLog
看一下
执行好以后,threadLog 发来看下。
------解决方案--------------------pid是进程id,不能写死。
------解决方案--------------------把创建的线程id和名字打印出来看一下。
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("*********** 测试2 ***********");
}
});
System.out.println("the created thread id: " + t1.getId() + ", thread Name:" + t1.getNa