当另一个线程在java

时间:2015-12-24 09:47:15

标签: java multithreading

我是使用多线程编程的新手,所以我真的不明白为什么我的代码无法正常工作。

我在这个网站上查找并搜索了答案,也在google上搜索,但没有找到任何东西(或者我不知道这对我来说是正确的答案),所以我问你专家。

我必须让用户输入一个数字。这个数字将是Fibonacci中将显示在屏幕上的器官数量,每个器官之间有1秒的延迟。另一个线程将在屏幕上显示到目前为止每5秒钟一次的时间。

我已经使用了一个循环,但这没有任何意义,因为我需要它在第一个线程运行时继续运行并在不运行时停止。

当创建斐波那契的第一个线程停止时,我不知道如何停止第二个线程。

我尝试使用join()notifyAll()stop(),但我显然遗漏了一些东西。我会给出代码(没有joinnotifyAllstop,因为它对我不起作用)。

这是主要的:

import java.util.Scanner;
    public class MainFibonacci 
    {

    public static void main(String[] args) throws InterruptedException {

        int num;
        System.out.println("How many numbers in Fibonacci would you like?");
        Scanner in = new Scanner(System.in);
        num=in.nextInt();
        FibTime f1=new FibTime();
        MakeFibonacci m1= new MakeFibonacci(num);
        m1.start();
        f1.start();
    }
}

创建斐波纳契的类:

public class MakeFibonacci extends Thread{
private int number;

//constructor
public MakeFibonacci(int num){
    this.number=num;
}

public void run()
{
    for  (int i=1;i<=number;i++)
    {
        System.out.print(fibonacci(i) +"  ");

        try
        {
            Thread.sleep(1000);
        } 
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }
 }

  //The actual method that creates the fibonacci
  public int fibonacci(int number)
  {
        if(number == 1 || number == 2)
        {
            return 1;
        }

        int num1=1, num2=1, next=1;

        for(int i = 3; i<= number; i++)
        {
            next = num1 + num2; 
            num1 = num2;
            num2 = next;

        }
        return next; 
    } 

}

第二节用mwthos表示已经过了多长时间:

public class FibTime extends Thread 
{
    private int timePassed=5;

    public void run()
    {
       for(int i=1;i<timePassed;i++)
       {
        try
        {
            Thread.sleep(5000);
    System.out.println("Time so far is "+ (timePassed*i) +" seconds");              
        }
        catch (InterruptedException e)
        {

            e.printStackTrace();
        }

       }

    }

}

2 个答案:

答案 0 :(得分:1)

您已经在main函数本身中为FibTime创建了对象。相反,您可以将其声明为MakeFibonacci类的成员,在MakeFibonacci类的构造函数中为FibTime创建对象并在其自身启动它。 现在,您将拥有对FibTime线程的对象引用。您可以使用该引用停止FibTime线程。将.stop()命令放在打印Fibonacci数字的for循环之后。

其他方法是将作为参数执行的FibTime线程的对象传递给MakeFibonacci构造函数并将其分配给MakeFibonacci的成员。以相同的方式停止此线程..

答案 1 :(得分:0)

你可以做的一件事是:

CountDownLatch

这可以按照您的意图使用。 Thread.sleep()是为了确保两个线程同时启动。然而,有几点是缺乏的。

  1. 使用shceduledExecutors不是最好的解决方案。您可以使用volatile
  2. 这不是计算Fibonacci对特定数字所花费多少的最佳方式,但我已经以这种方式给出它以演示如何在两个不同的线程之间进行完成通信。
  3. 请注意{{1}}。如果它不是易失性的,它将无法正常工作。 (至少没有同步)。