public class Work { private Logger logger=Logger.getLogger(this.getClass().getName()); public void doWork(String name){
try {
logger.log(Level.INFO,name+"开始工作..."); //日志
System.out.println(name+"努力工作...");//业务逻辑代码
logger.log(Level.INFO,name+"结束工作...");//日志
} catch (Exception e) {
logger.log(Level.SEVERE,name+"工作出现问题...");//日志
}
}
public static void main(String[] args) {
Work w=new Work();
w.doWork("小明");
}
}请问这段代码,为什么有时候输出的是:小明努力工作...
2013-10-10 20:34:10 com.wzh.test.Work doWork
信息: 小明开始工作...
2013-10-10 20:34:10 com.wzh.test.Work doWork
信息: 小明结束工作...
有时候输出的又是:2013-10-10 20:44:27 com.wzh.test.Work doWork
信息: 小明开始工作...
2013-10-10 20:44:27 com.wzh.test.Work doWork
信息: 小明结束工作...
小明努力工作...
应该要按顺序执行,始终输出下面这段才对2013-10-10 20:45:36 com.wzh.test.Work doWork
信息: 小明开始工作...
小明努力工作...
2013-10-10 20:45:36 com.wzh.test.Work doWork
信息: 小明结束工作...如果不按顺序执行,我又怎么能通过写日志来跟踪代码呢??

解决方案 »

  1.   

    程序确实是由上往下执行的,但是控制台显示顺序乱了,因为他们的输出对象不一样,如果是一样的, 比如统一适用System.out.print输出 肯定不会乱了顺序,同样的情况还有System.err.print  
      

  2.   

    哦,我还以为Logger是通过自己的线程输出的,线程不同步造成的。那么如果我都输出到文本日志里,都是顺序的吧?
      

  3.   

    这里不涉及到多线程吧、、、不过你倒是提醒我了 ,可以使用多线程尝试解决不同输出对象输出到控制台顺序的问题,具体如下:
    public class Test {
    public static void main(String[] args) throws UnsupportedEncodingException, InterruptedException {
                new Thread(new MyThread()).start();
    }
    }class MyThread implements java.lang.Runnable
    {
        boolean isOut = true;
        @Override
        public synchronized void run() 
        {
            for (int i = 0; i < 10; ++i)
            {
             if(isOut){
             System.out.println("Thread: " + i);
             isOut = false;
             }else{
             System.err.println("Thread : " + i);
             isOut = true;
             }
            }
        }
    }输出结果:
      

  4.   

    是不是说不同的输出对象,使用的线程是不同的?我没看到Logger类的源码里有使用多线程啊?
      

  5.   

    不清楚你的是什么Logger,但看样子log就是按多线程方式输出的,它是单起一个线程输出的吧,有源码吗,看一下
      

  6.   

    是不是说不同的输出对象,使用的线程是不同的?我没看到Logger类的源码里有使用多线程啊?你可以看看System.out的源码
      

  7.   

    就是 java.util.logging.Logger
    貌似是没有涉及到多线程而且多次运行发现两次log执行的内容还是严格按照顺序的
    这个可能就是涉及到System.out了
      

  8.   

    就是 java.util.logging.Logger
    貌似与println也木关系(也不是多线程,即使是多线程也不可能跑到第一句log之前)
    看来确实是一楼说的eclipse控制台输出实现的问题了,其特点还是同类型对象能保持顺序
      

  9.   

    我看怎么是log的顺序没变,只有log和print的顺序 变了。只要2013-10-10 20:34:10 com.wzh.test.Work doWork 信息: 小明开始工作... 2013-10-10 20:34:10 com.wzh.test.Work doWork 信息: 小明结束工作...顺序不变就行