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" 完成其工作后继续存在然后消失了。
嗨,我正在 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" 完成其工作后继续存在然后消失了。