运行线程和可运行线程

时间:2016-02-17 01:13:04

标签: java multithreading

我试图创建一个包含两个类的小程序,一个扩展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工作。

任何帮助将不胜感激, 提前致谢。 山姆

3 个答案:

答案 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个对象,即使您有ThreadisAlive()也不会返回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()