解决方案 »

  1.   


    Thread t = new Thread(){
         public void run(){
     Log.info("*********** 测试2 ***********", "");
         }
    }.start();
    t.join();  //等待
      

  2.   

    @shnulaa:Thread t = new Thread(){
         public void run(){
     Log.info("*********** 测试2 ***********", "");
         }
    }.start();
    t.join();  //等待这种写法编译不通过!
      

  3.   

    @shnulaa:能不能解释一下,谢谢
      

  4.   

    ajax没有返回是什么意思?
    是指没有callback吗?只打印了“测试1”
    -> 测试2没有打印是可以理解的,
    但是测试3没有打印是不正常的,除非之前出了异常,即使在thread中出异常也不会导致测试3没有打印。t.join();
    -> 加上的原因是等待该线程完成后,继续。想确认
    1 到底想什么时候返回ajax回调函数? 测试3打印完还是另外线程方法结束后。
    2 因为业务不知道,为什么要异步?要实现什么功能?
      

  5.   

    @shnulaa:逻辑是这样的:页面使用ajax调用后台,后台会返回页面一个参数,页面判断这个参数进行提示用。
    现在出现新需求,后台除了返回那个参数外,另外还要做一系列其他的处理。但是这些处理跟用户无关,所以为了不影响正常给用户提示,我将新增加的一系列操作放在了一个新的线程里,不影响给用户正常提示。想要的结果是:ajax 请求过来后,新线程中的操作不影响主线程给前台返回参数,并做提示用。也就是一个线程用来ajax前台页面提示,另外一个线程用来其他事情的操作。刚才测试发现,“测试3”打印出来。想在“测试3”打印完后就返回ajax回调,另外线程继续处理。不知道说明白了没,多谢关注!
      

  6.   

    那也没什么问题,request线程打印了测试3以后,回归线程池,任务结束,而新建的线程
    也会异步的继续执行,如果该线程为非守护线程,他的生命周期就是run方法
    逻辑的结束。新建的线程不会随着request线程的结束而结束。
    就会有一个问题,就是页面上显示已经完成,但是其实还有一部分的功能还没有实现。最好在新建的线程结束有一个回调。
      

  7.   

    唉~  郁闷的是本地无法调试只能打log放服务器上去试本地单元测试模拟直接调用一切正常,放服务器上用ajax调就是不走
      

  8.   

    Log.info("*********** 测试1 ***********", "");

    new Thread(){
       public void run(){
    Log.info("*********** 测试2 ***********", "");
    return;
       }
    }.start();

    Log.info("*********** 测试3 ***********", "");输出:
    *********** 测试1 ***********
    回调失败Log.info("*********** 测试1 ***********", "");

    //new Thread(){
    //   public void run(){
    // Log.info("*********** 测试2 ***********", "");
    // return;
    //   }
    //}.start();

    Log.info("*********** 测试3 ***********", "");输出:
    *********** 测试1 ***********
    *********** 测试3 ***********
    回调正常
      

  9.   

    现在可以确定,不是ajax的原因
      

  10.   


    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
      

  11.   

    两个地方都改了
    1 Runnable
    2 Log.info -> System.out.println还是不行,到 new Thread 就停了!
      

  12.   

    什么容器?环境 linux, windows?
    框架?
      

  13.   

    环境是linux
    页面发布在resin下
    java代码没有容器,直接启动jar
    没有用框架,java+jsp
      

  14.   

    不过整个环境依赖一个平台,主要做参数存储用。这个平台底层是用ThreadLocal实现的
      

  15.   

    jstack -l [pid] > threadLog看一下执行好以后,threadLog 发来看下。
      

  16.   

    >jstack -l [pid] > threadLog
    Attaching to remote server [pid], please wait...
    Error attaching to remote server: java.net.MalformedURLException: invalid URL String: //[pid]/SARemoteDebugger
    报错了。
      

  17.   

    $.../201402/28> jstack -l pid > threadLog
    Attaching to remote server pid, please wait...
    Error attaching to remote server: java.rmi.ConnectException: Connection refused to host: pid; nested exception is: 
    java.net.ConnectException: Connection timed out
    超时
      

  18.   

    不知道这些是否有价值:"file" daemon prio=10 tid=0x80eca800 nid=0x9ca in Object.wait() [0x80dfe000]
       java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x94173228> (a org.apache.hadoop.metrics2.impl.SinkQueue)
    at java.lang.Object.wait(Object.java:485)
    at org.apache.hadoop.metrics2.impl.SinkQueue.waitForData(SinkQueue.java:109)
    - locked <0x94173228> (a org.apache.hadoop.metrics2.impl.SinkQueue)
    at org.apache.hadoop.metrics2.impl.SinkQueue.consumeAll(SinkQueue.java:78)
    at org.apache.hadoop.metrics2.impl.MetricsSinkAdapter.publishMetricsFromQueue(MetricsSinkAdapter.java:113)
    at org.apache.hadoop.metrics2.impl.MetricsSinkAdapter$2.run(MetricsSinkAdapter.java:89)   Locked ownable synchronizers:
    - None"pool-3-thread-2" prio=10 tid=0x80e85800 nid=0x9c9 waiting on condition [0x80ffe000]
       java.lang.Thread.State: TIMED_WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x94171418> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:196)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2025)
    at java.util.concurrent.DelayQueue.take(DelayQueue.java:164)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:609)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:602)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
    at java.lang.Thread.run(Thread.java:662)   Locked ownable synchronizers:
    - None"New I/O server boss #1 (channelId: 2737550, /192.168.0.143:60000)" prio=10 tid=0x81977000 nid=0x9c8 runnable [0x817ad000]
       java.lang.Thread.State: RUNNABLE
    at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
    at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:210)
    at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:65)
    at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:69)
    - locked <0x941733b0> (a sun.nio.ch.Util$2)
    - locked <0x941733c0> (a java.util.Collections$UnmodifiableSet)
    - locked <0x94173370> (a sun.nio.ch.EPollSelectorImpl)
    at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:80)
    at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink$Boss.run(NioServerSocketPipelineSink.java:241)
    at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)
    at org.jboss.netty.util.internal.IoWorkerRunnable.run(IoWorkerRunnable.java:46)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)   Locked ownable synchronizers:
    - <0x94173468> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
    - <0x941cef68> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)"pool-3-thread-1" prio=10 tid=0x81989000 nid=0x9c7 waiting on condition [0x817fe000]
       java.lang.Thread.State: TIMED_WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x94171418> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:196)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2025)
    at java.util.concurrent.DelayQueue.take(DelayQueue.java:164)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:609)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:602)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
    at java.lang.Thread.run(Thread.java:662)   Locked ownable synchronizers:
    - None"Low Memory Detector" daemon prio=10 tid=0x8319a000 nid=0x9c5 runnable [0x00000000]
       java.lang.Thread.State: RUNNABLE   Locked ownable synchronizers:
    - None"C2 CompilerThread1" daemon prio=10 tid=0x83198000 nid=0x9c4 waiting on condition [0x00000000]
       java.lang.Thread.State: RUNNABLE   Locked ownable synchronizers:
    - None"C2 CompilerThread0" daemon prio=10 tid=0x83196000 nid=0x9c3 waiting on condition [0x00000000]
       java.lang.Thread.State: RUNNABLE   Locked ownable synchronizers:
    - None"Signal Dispatcher" daemon prio=10 tid=0x83194800 nid=0x9c2 runnable [0x00000000]
       java.lang.Thread.State: RUNNABLE   Locked ownable synchronizers:
    - None"Finalizer" daemon prio=10 tid=0x83186400 nid=0x9c1 in Object.wait() [0x830fe000]
       java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x94176150> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
    - locked <0x94176150> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
    at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)   Locked ownable synchronizers:
    - None"Reference Handler" daemon prio=10 tid=0x83184c00 nid=0x9c0 in Object.wait() [0x83267000]
       java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x94176300> (a java.lang.ref.Reference$Lock)
    at java.lang.Object.wait(Object.java:485)
    at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
    - locked <0x94176300> (a java.lang.ref.Reference$Lock)   Locked ownable synchronizers:
    - None"VM Thread" prio=10 tid=0x83181000 nid=0x9bf runnable "GC task thread#0 (ParallelGC)" prio=10 tid=0x09e5d400 nid=0x9ad runnable "GC task thread#1 (ParallelGC)" prio=10 tid=0x09e5ec00 nid=0x9ae runnable "GC task thread#2 (ParallelGC)" prio=10 tid=0x09e60000 nid=0x9af runnable "GC task thread#3 (ParallelGC)" prio=10 tid=0x09e61800 nid=0x9b0 runnable "GC task thread#4 (ParallelGC)" prio=10 tid=0x09e62c00 nid=0x9b1 runnable "GC task thread#5 (ParallelGC)" prio=10 tid=0x09e64400 nid=0x9b2 runnable "GC task thread#6 (ParallelGC)" prio=10 tid=0x09e65c00 nid=0x9b3 runnable "GC task thread#7 (ParallelGC)" prio=10 tid=0x09e67000 nid=0x9b4 runnable "GC task thread#8 (ParallelGC)" prio=10 tid=0x09e68800 nid=0x9b5 runnable "GC task thread#9 (ParallelGC)" prio=10 tid=0x09e69c00 nid=0x9b6 runnable "GC task thread#10 (ParallelGC)" prio=10 tid=0x09e6b400 nid=0x9b7 runnable "GC task thread#11 (ParallelGC)" prio=10 tid=0x09e6c800 nid=0x9b8 runnable "GC task thread#12 (ParallelGC)" prio=10 tid=0x09e6e000 nid=0x9b9 runnable "GC task thread#13 (ParallelGC)" prio=10 tid=0x09e6f800 nid=0x9ba runnable "GC task thread#14 (ParallelGC)" prio=10 tid=0x09e70c00 nid=0x9bb runnable "GC task thread#15 (ParallelGC)" prio=10 tid=0x09e72400 nid=0x9bc runnable "GC task thread#16 (ParallelGC)" prio=10 tid=0x09e73800 nid=0x9bd runnable "GC task thread#17 (ParallelGC)" prio=10 tid=0x09e75000 nid=0x9be runnable "VM Periodic Task Thread" prio=10 tid=0x8319c000 nid=0x9c6 waiting on condition JNI global references: 1221
      

  19.   

    把创建的线程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.getName());
            t1.start();
      

  20.   

    发现问题
    代码还没有执行到:
    System.out.println("the created thread id: " + t1.getId() + ", thread Name:" + t1.getName());
    这里,就已经停顿了。
    也就是说,t1.start()没有被执行也!
      

  21.   

    实在不太懂jstack这个东西怎么使用,上周我发给你的那个log是输出threadlog最后的信息,上面还有很多,怎么看是否全
      

  22.   

    问题已经解决,代码没有问题,是所在平台的问题。非常感谢,@shnulaa 对问题的持续关注,也很大程度的帮助了我,好人一生平安,哈哈