Java 线程对象与 运行 线程

Java Thread object vs Running Thread

嗨,我正在 java 学习和玩线程。我在一本书中读到 Thread 对象和 运行 线程不相同 thing.even 线程完成它是 运行 方法 运行ning 线程进入死状态我什至用 isAlive 检查() 方法。我想知道,如果两者不同,那么按照我的理解,以下代码无法正常工作。

public class Main {

    public static void main(String[] args) throws ParseException {
        Student s = new Student();

        Thread t = new Thread(s);

        t.start();
        t.run();
        t.run();
        t.run();

        t.run();
        t.run();

    }
}

class Student implements Runnable {
    public void run() {

        try {
            Thread.sleep(1000);
            System.out.println(Thread.currentThread().getName());
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

它只显示这个输出。 主要的 线程 0 主要的 或这个 线程 0 主要

从这个结果我了解到线程完成后它是 运行 方法。 运行 线程进入死状态并调用 Thread obj 方法 no working.but 我无法理解背后的原因,因为 Thread 对象是技能参考以及 Thread class 的其他方法。 像 屈服()? 开始()?

这里是另一种场景,可以清楚地理解我所说的

public class Main {

    public static void main(String[] args) throws ParseException {
        Student s = new Student();

        Thread t = new Thread(s);

        t.start();

        if (!t.isAlive()) {

            t.start();
        }

    }
}

class Student implements Runnable {
    public void run() {

        try {
            Thread.sleep(1000);
            System.out.println(Thread.currentThread().getName());
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

文档说如果我们在 Thread t 对象上调用 start 方法,那么它将抛出 java.lang.IllegalThreadStateException。但上面的代码工作正常。 我很困惑 Thread class 的哪些方法依赖于 运行 thread 以及 thread 对象的哪些方法。我希望你明白这个问题。 提前致谢?

两种方式都可以。这几乎是一样的。您应该使用简单的

在您的第一个代码文件中启动线程
t.start();

我会从你上面的代码中删除所有 t.run(),因为你正在用你实现的内部 class.

创建一个新的 Thread 对象

t.start() 启动线程后,此条件:

if (!t.isAlive()) 

不太可能满足 veeeeeeeeeeeeeeeeeeeeeee -- 因为启动的线程不会阻塞。这就是为什么它只是跳过(因为t.isAlive() == true)并无一例外地走得更远。

在您的第一次尝试中,您从未重新启动线程:

t.start();
t.run();// does not restarts the thread, it simply makes synchronous call the run(), hence you don't get the exception
t.start();// add this line, to restart the thread and get the exception

第二次尝试时,条件失败,因为线程可能已启动并且处于活动状态,根据您的条件,线程不能处于活动状态并且无法重新启动线程。

t.start();
t.join();// add this line, it allows thread to complete first
if (!t.isAlive()) {
    t.start();
}

P.S.

为了启动线程调用 start(),这将导致对 run() 的异步调用。如果调用 run(),它不会作为线程启动,它将像普通方法调用一样是同步调用。

在您提供的第一个示例中,程序未显示等于您的 t.start() + t.run() 调用的线程名称计数的原因是线程死后,您无法再次调用它 start()run()。它死了。有 3 个输出的原因可能是因为在 t.start() 进入死状态之前,其他 2 个调用设法执行。

在第二个示例中,您应该知道当调用 start() 时,线程状态处于活动状态。无论如何,在并发环境中,如果不涉及 synchronized,则不能依赖操作调用序列,但是,从获得的结果来看,似乎 t.start()t.isAlive() 检查之前被调用. 希望能帮到你。

i read in a book that Thread object and Running Thread is not same thing.

对,一个"thread"是你代码的执行。 Thread 是一个 Java 对象,您可以使用它来创建和管理 "thread" 的生命周期。在您调用 Thread 对象的 .start() 方法之前,不会创建 "thread",并且 Thread 对象可以在 "thread" 完成其工作后继续存在然后消失了。