对线程行为有点困惑

Jea*_*ean 7 java multithreading

我在Thread中编写了一个基本代码,我得到的输出非常令人惊讶.

public class ThreadImp implements Runnable{

    public static void main(String[] args) {
        ThreadImp threadImp = new ThreadImp();
        Thread t =new Thread(threadImp);
        t.setName("Fred");
        t.start();
        threadImp.run();
        t.run();

    }
    public void run(){
        System.out.println("Current Thread: "+ Thread.currentThread());
    }
}
Run Code Online (Sandbox Code Playgroud)

我期待的输出是它将打印

当前线程:线程[main,5,main]

当前线程:线程[Fred,5,main]

当前线程:线程[main,5,main]

这个结果我可以理解,我只创建了一个线程,即Thread Fred.其他两个run方法调用就像调用普通方法一样.

但我无法理解的是,当我执行相同的程序时,我得到以下输出.所以任何人都可以向我解释为什么它会像这样.

当前线程:线程[main,5,main]

当前线程:线程[Fred,5,main]

Mar*_*eel 10

你打电话Thread.run()(你通常不应该直接打电话),如果Thread已完成并自行清理,则无效:

@Override
public void run() {
    if (target != null) {
        target.run();
    }
}
Run Code Online (Sandbox Code Playgroud)

来源:Java 7更新79

target提供的runnable 在哪里.该字段target设置为null线程结束时:

/**
 * This method is called by the system to give a Thread
 * a chance to clean up before it actually exits.
 */
private void exit() {
    if (group != null) {
        group.threadTerminated(this);
        group = null;
    }
    /* Aggressively null out all reference fields: see bug 4006245 */
    target = null;
    /* Speed the release of some of these resources */
    threadLocals = null;
    inheritableThreadLocals = null;
    inheritedAccessControlContext = null;
    blocker = null;
    uncaughtExceptionHandler = null;
}
Run Code Online (Sandbox Code Playgroud)

来源:Java 7更新79

所以确切的输出(包括顺序,如果你得到两个或三个消息)取决于时间,调度等.