使用isALive()或join方法时出错

时间:2013-07-29 06:50:39

标签: java multithreading

我正在尝试使用isALive和join方法但它抛出的错误就像找不到符号....请告诉我这个程序中的错误究竟在哪里。 什么是join方法的用法。我知道它是等待线程完成但我想详细说明。

class newthread1 implements Runnable {
    newthread1() {
        Thread t = new Thread(this, "FirstThread");
        System.out.println("Child Thread:" + t);
        t.start();
    }

    public void run() {
        System.out.println("We are in processing for 1st thread");
        int p = 1000, t = 3;
        double r = 3.5, si;
        try {
            si = (p * r * t) / 100;
            System.out.println("Simple Interest:" + si);
        } catch (ArithmeticException e) {
            System.out.println("Error:" + e);
        }
    }
}

class newthread2 implements Runnable {

    newthread2() {
        Thread t = new Thread(this, "SecondThread");
        System.out.println("Child Thread:" + t);
        t.start();
    }

    public void run() {
        try {
            System.out.println("We are in processing for 2nd thread");
            double a, r = 4.3;
            int p = 1000, n = 3;
            double temp = Math.pow((1 + r / 100), n);
            a = temp * p;
            System.out.println("Compound interest:" + a);
        } catch (ArithmeticException e) {
            System.out.println("Error:" + e);
        }
    }
}

class mainthread {
    public static void main(String args[]) {
        newthread1 t11 = new newthread1();
        new newthread2();
        boolean b = t1.t.isAlive();
        System.out.println("Thread is alive:" + b);
        t1.t.join();
    }
}   

5 个答案:

答案 0 :(得分:4)

解决方案1 ​​ 将主要方法更改为

class mainthread {
    public static void main(final String args[]) throws InterruptedException {
        Thread thread = new Thread(new newthread1());
        newthread1 t11 = new newthread1();
        new newthread2();
        boolean b = thread.isAlive();
        System.out.println("Thread is alive:" + b);
        thread.join();
    }
}

并运行线程调用thread.start(),创建可运行对象的实例将不会自动开始运行。你明确告诉线程开始或停止。

解决方案2
或者您可以将线程对象't'创建为global varibable并将类更改为

class newthread1 implements Runnable {
    public Thread t;

    newthread1() {
        t = new Thread(this, "FirstThread");
        System.out.println("Child Thread:" + t);
        t.start();
    }

    @Override
    public void run() {
        System.out.println("We are in processing for 1st thread");
        int p = 1000, t = 3;
        double r = 3.5, si;
        try {
            si = p * r * t / 100;
            System.out.println("Simple Interest:" + si);
        } catch (ArithmeticException e) {
            System.out.println("Error:" + e);
        }
    }

    public Thread getT() {
        return t;
    }
}

然后主要方法为

class mainthread {
    public static void main(final String args[]) throws InterruptedException {
        newthread1 t11 = new newthread1();
        new newthread2();
        boolean b = t11.t.isAlive();
        System.out.println("Thread is alive:" + b);
        t11.t.join();
    }
}

答案 1 :(得分:2)

我个人建议您先学习有关Java基础知识的教程。我确信您不清楚以下基本Java:

boolean b=t1.t.isAlive();

您没有将名为t1的变量命名,但您仍尝试使用它。

编译器找不到任何名为t1的变量,它会抱怨Cannot find symbol t1

我认为你想使用t11

即使您使用t11,它仍会抱怨,因为您的班级t中没有newthread1作为类变量,而是在内部定义了一个局部变量构造

还尝试阅读一些Java标准,如如何声明类,命名约定等。

将来会对你有所帮助。

答案 2 :(得分:1)

第一个错误,您已将参考变量定义为t11

 newthread1 t11=new newthread1();

因此在代码中使用t11

boolean b=t11.t.isAlive(); // change t1 to t11

其次,Thread tnewthread1类中没有定义newthread2个实例变量。这可能会有所帮助:

class newthread1 implements Runnable{
  Thread t; // make this an instance variable , currently it is local to constructor
  newthread1()
 {
   t=new Thread(this,"FirstThread");
   System.out.println("Child Thread:"+t);
   t.start();
 }

答案 3 :(得分:1)

要在java中创建一个线程,有two ways
1.通过实施Runnable界面 2.扩展Thread课程。

如果您实施Runnable界面,则需要将Runnable对象传递给Thread
构造
的。
这样你的对象就会获得Thread行为。

如果您扩展Thread课程,那么您需要创建Thread扩展课程的对象
这样你的对象就会获得Thread行为。

但是你没有遵循上述两种方式中的任何一种,

在您的代码中,语句newthread1 t11 = new newthread1();仅创建简单对象
不是Thread object 但是您尝试在Thread上调用导致编译错误的normal object方法。

为避免错误,您需要遵循以上两种方式之一 更具体的你必须  用此声明替换newthread1 t11 = new newthread1();

 Thread thread = new Thread(new newthread1());//first way implements Runnable

或用此声明替换class newthread1 implements Runnable{

class newthread1 extends Thread implements Runnable{//second way extends Thread

答案 4 :(得分:0)

  

我正在尝试使用isALive

没有这样的方法。你的意思是isAlive()

  

和join方法但它抛出的错误就像找不到符号

这是一个编译错误,可能是因为拼写错误。打印编译错误,而不是“抛出”。

  

请告诉我这个程序中的错误在哪里。

编译器已经这样做了,你还没有在这里发布。如果您希望其他人为您重新编译您的程序只是为了找到错误网站,我建议您可能需要等待很长时间。

  

以及join method的用法。我知道它是等待线程完成但我想详细说明。

详细信息可在Javadoc中找到。我可以在这里引用它,但坦率地说,当你应该已经阅读它时,我看不出这一点。如果你有什么不明白的地方,你应该在你的问题中说出来。