1

我正在尝试使用 isALive 和 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();
    }
}   
4

5 回答 5

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
或者您可以将 Thread 对象创建'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();
    }
}
于 2013-07-29T06:56:05.163 回答
2

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

boolean b=t1.t.isAlive();

您没有一个名为定义为的变量t1,但您仍然尝试使用它。

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

我想你想使用t11.

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

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

将来会对你有很大帮助。

于 2013-07-29T06:54:44.950 回答
1

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

 newthread1 t11=new newthread1();

因此t11在您的代码中使用:

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

其次,在or类中没有Thread t定义实例变量。这可能会有所帮助:newthread1newthread2

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();
 }
于 2013-07-29T06:52:53.737 回答
1

在java中创建线程有两种方法
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
于 2013-07-29T07:11:30.457 回答
0

我正在尝试使用 isALive

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

并加入方法,但它抛出一个错误,如找不到符号

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

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

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

以及加入方法的用途是什么。我知道这是等待线程完成,但我想要详细信息。

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

于 2013-07-29T07:03:22.020 回答