我试图创建一个包含两个类的小程序,一个扩展Thread的类和一个实现Runnable的类。
然后我创建了第三个类,我在其中创建了两个类的对象,我想运行线程并且只在两个线程完成时结束程序。
我查看了java文档,并使用.isAlive()函数来检查线程是否还活着... 虽然这适用于我的线程对象,它扩展了Thread但似乎不适用于实现Runnable的线程。
public class TaskTwo extends Thread {
public void run() {
System.out.println("Thread start");
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Thread end");
}
public class TaskThree implements Runnable {
@Override
public void run() {
System.out.println("Runnable thread start");
try {
java.lang.Thread.sleep(1500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Runnable thread end");
}
public class TaskFour {
static TaskTwo thread1 = new TaskTwo();
static TaskThree thread2 = new TaskThree();
public static void main(String[] args) {
if (thread1.isAlive() && thread2.isAlive()) {
thread1.run();
} else {
System.out.println("Threads completed");
}
}}
错误代码位于if语句行的TaskFour类中。 Eclipse告诉我在TaskThree类中为isAlive()创建一个方法,并且我不确定为什么它为Thread而不是Runnable工作。
任何帮助将不胜感激, 提前致谢。 山姆
答案 0 :(得分:0)
这里的第一个问题是你应该拨打Thread.start
而不是run
您可以使用Thread.join方法
等待线程完成答案 1 :(得分:0)
实现TaskThree实现Runnablle这是一个接口。你必须这样做
Runnable r = new ThreadThree();
Thread theadthree = new Thread(r);
threadthree.start();
这应该可以正常工作。 THANKYOU
答案 2 :(得分:0)
isAlive
中没有TaskThree
方法,因为它不是Thread
- 它只是您编写的实现Runnable
的类,Runnable
只定义run
方法。
询问它们是否还活着,然后调用run
不是启动线程的方法。您必须拥有Thread
个对象,即使您有Thread
,isAlive()
也不会返回true
,除非您已启动{{1}使用Thread
方法。
测试此线程是否存活。如果一个线程已经启动并且还没有死亡,那么它就是活着的。
您已经通过继承start
来创建Thread
就好了。但是,他们尝试使用Thread
创建Thread
的方式不正确。您必须创建Runnable
并将Thread
作为参数传递给构造函数。
Runnable
您可以直接调用static Thread thread2 = new Thread(new TaskThree());
,但这不会做任何特别的事情 - 它只是调用当前线程中的方法。要启动run()
,请拨打Thread
,在另一个主题中调用start
。
run()
通过调用其thread1.start();
thread2.start();
方法等待线程完成,该方法将阻塞直到线程完成。
join()