是否已覆盖或使用已弃用的API?

时间:2014-03-17 05:01:35

标签: java

以下是我用于使用两个线程计算数字的阶乘的代码。 当我尝试编译它时,它说' ....'使用或覆盖已弃用的API,有人请帮助解决此问题。

import java.lang.Thread;
import java.util.Scanner;

class A extends Thread
{
    int n;
    int fact=1;
    int i;
    A(int x)
    {
        n=x;
        i=n;
    }
    public void run()
    {
        if(i>0)
        {
            fact=fact*i;
            i--;
        }
        else
            System.out.print(fact);
            suspend();
    }
}

class B extends Thread
{
    int i;
    int n;
    int fact=1;
    B(int x)
    {
        n=x;
        i=n;
    }
    public void run()
    {
        if(i>0)
        {
            fact=fact*i;
            i--;
        }
        else
            System.out.print(fact);
            suspend();
    }
}

class refact
{
    public static void main(String args[])
    {
        int n;
        System.out.print("Enter the number you want :");
        Scanner a = new Scanner(System.in);
        n=a.nextInt();
        System.out.print("\n\n");
        A newthreadA = new A(n);
        newthreadA.start();
        B newthreadB = new B(n);
        newthreadB.start();
    }
}

此外,如果其他人有更好的想法使用两个线程计算数字的阶乘,请提及。 谢谢!

2 个答案:

答案 0 :(得分:3)

您收到错误,因为不推荐使用Thread.suspend。以下是docs

中的更多信息
  

为什么不推荐使用Thread.suspend和Thread.resume?

     

Thread.suspend本身就容易出现死锁。如果是目标线程   在监视器上保持锁定,以保护关键系统资源   它被挂起,没有线程可以访问此资源,直到目标   线程恢复。如果线程将恢复目标线程   尝试在调用resume,deadlock之前锁定此监视器   结果。这种死锁通常表现为“冻结”   过程

答案 1 :(得分:1)

这里使用的是在Java中弃用的suspend()。

尝试使用任何类似executing的布尔变量来停止线程。

public void run() {
        this.executing= true;
        while (this.executing) {
            try {
                //code of factorial
            } catch (InterruptedException e) {

                this.executing= false;
            }
        }