Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java线程对象与运行线程_Java_Multithreading_Ocpjp_Java Threads - Fatal编程技术网

Java线程对象与运行线程

Java线程对象与运行线程,java,multithreading,ocpjp,java-threads,Java,Multithreading,Ocpjp,Java Threads,嗨,我正在学习和玩java线程。我在一本书中读到,线程对象和运行线程不是一回事。即使线程完成了它的运行方法,运行线程也会进入死状态,我甚至用isAlive方法检查。我想知道,如果两者都不同,那么下面的代码就不能按照我的理解工作 public class Main { public static void main(String[] args) throws ParseException { Student s = new Student(); Thre

嗨,我正在学习和玩java线程。我在一本书中读到,线程对象和运行线程不是一回事。即使线程完成了它的运行方法,运行线程也会进入死状态,我甚至用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 主要

从这个结果我了解到,在线程完成之后,它是run方法。运行线程会进入死状态,调用线程obj方法无法工作。但我无法理解背后的原因,因为线程对象是技能引用,线程类的其他方法又如何。 喜欢 产量 开始

下面是另一个清晰理解我所说内容的场景

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();
        }

    }

}
文档说,若我们在线程t对象上调用start方法,那个么它将抛出java.lang.IllegalThreadStateException。但是上面的代码运行良好。 对于线程类的哪些方法依赖于运行线程,哪些方法依赖于线程对象,我感到非常困惑。我希望你能理解这个问题。
提前谢谢?

你可以用两种方法。几乎一样。您应该在第一个代码文件中用一个简单的

t.start();

我将从上述代码中删除所有的t.run,因为您正在使用实现的内部类创建一个新的线程对象。

您可以通过两种方式来完成。几乎一样。您应该在第一个代码文件中用一个简单的

t.start();

我将从上述代码中删除所有t.run,因为您正在使用实现的内部类创建一个新的Thread对象。

在t.start启动线程之后,此条件:

if (!t.isAlive()) 

不太可能满足Veeeery,因为启动的线程未阻塞。这就是为什么它只是跳过,因为t.isAlive==true,并且毫无例外地更进一步。

在通过t.start启动线程之后,此条件:

if (!t.isAlive()) 

不太可能满足Veeeery,因为启动的线程未阻塞。这就是为什么它只是跳过,因为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();
}
附言


为了启动线程,调用start,这将导致异步调用运行。如果您调用run,它将不会以线程的形式启动,它将像普通方法调用一样是同步调用。

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

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();
}
附言


为了启动线程,调用start,这将导致异步调用运行。如果您调用run,它将不会以线程的形式启动,它将像普通方法调用一样是同步调用。

在您提供的第一个示例中,程序未显示与t.start+t.run调用相等的线程名称计数的原因是,在线程死后,您无法调用它重新启动或运行。它死了。有3个输出的原因很可能是因为在t.start进入死状态之前,其他2个调用将设法执行

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

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

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

我在一本书中读到线程对象和运行线程不是一回事

对,线程是代码的执行。线程是一个Java对象,可用于创建和管理线程的生命周期。在调用thread对象的.start方法之前,不会创建线程,即使线程完成其工作并消失,thread对象也可以继续存在

我在一本书中读到线程对象和运行线程不是一回事

对,线程是c语言的执行
颂诗线程是一个Java对象,可用于创建和管理线程的生命周期。在调用thread对象的.start方法之前,不会创建线程,即使线程完成其工作并消失,thread对象也可以继续存在。

实现内部类Student类的第一件事是单独的类。其次,我多次调用run方法,以了解为什么该方法不调用,因为它只是驻留在堆上的简单对象,并且仍然引用和对象幕后故事。实现内部类学生类的第一件事是单独的类。其次,我多次调用run方法,以了解为什么该方法不调用,因为它只是驻留在堆上的dam简单对象,并且它仍然引用和对象幕后故事。我知道大多数情况下它不会发生。但是为什么run和其他方法仍然不能像我的第一个代码那样工作,因为它尚未使用在t.start的第一次调用中创建它的Runnable s。如果此线程是使用单独的Runnable run对象构造的,则调用该Runnable对象的run方法;否则,此方法将不执行任何操作并返回。-你能详细说明一下吗?我知道大多数情况下,它不会发生。但是为什么run和其他方法仍然不能作为我的第一个代码工作,因为t已经在t.start的第一次调用中使用了创建它的Runnable s。如果此线程是使用单独的Runnable run对象构建的,然后调用可运行对象的run方法;否则,此方法将不执行任何操作并返回。-你能详细说明一下吗?OK Arvind我理解它,但我还不理解它为什么会发生。因为我使用起始线程的extends Thread类运行它,所以我多次调用run方法,它是有效的。@artaxerxe,请仔细阅读OP帖子,OP问为什么没有运行时错误?@Arvind我认为运行时错误指的是第二篇文章。但无论如何,你最新的评论澄清了这个问题。谢谢:。好的,Arvind,我明白了,但我还不明白为什么会发生这种情况。因为我使用起始线程的extends Thread类运行它,所以我多次调用run方法,结果都很好。@artaxerxe,请仔细阅读OP帖子,OP问为什么没有运行时错误?@Arvind,我想运行时错误是指第二篇帖子。但无论如何,你最新的评论澄清了这个问题。谢谢:。如果我在线程死后从thread类进行扩展怎么样。它是run方法working@T.Malik不能从对象延伸。你从一个类扩展而来。如果我没有正确理解,请更准确地说。如果我在线程死后从thread类进行扩展,怎么样?它是run方法working@T.Malik不能从对象延伸。你从一个类扩展而来。如果我不明白,请说得更准确些。