日期:2014-05-18  浏览次数:20700 次

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