我是使用多线程编程的新手,所以我真的不明白为什么我的代码无法正常工作。
我在这个网站上查找并搜索了答案,也在google上搜索,但没有找到任何东西(或者我不知道这对我来说是正确的答案),所以我问你专家。
我必须让用户输入一个数字。这个数字将是Fibonacci中将显示在屏幕上的器官数量,每个器官之间有1秒的延迟。另一个线程将在屏幕上显示到目前为止每5秒钟一次的时间。
我已经使用了一个循环,但这没有任何意义,因为我需要它在第一个线程运行时继续运行并在不运行时停止。
当创建斐波那契的第一个线程停止时,我不知道如何停止第二个线程。
我尝试使用join()
,notifyAll()
,stop()
,但我显然遗漏了一些东西。我会给出代码(没有join
,notifyAll
或stop
,因为它对我不起作用)。
这是主要的:
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();
}
}
}
}
答案 0 :(得分:1)
您已经在main函数本身中为FibTime创建了对象。相反,您可以将其声明为MakeFibonacci类的成员,在MakeFibonacci类的构造函数中为FibTime创建对象并在其自身启动它。 现在,您将拥有对FibTime线程的对象引用。您可以使用该引用停止FibTime线程。将.stop()命令放在打印Fibonacci数字的for循环之后。
其他方法是将作为参数执行的FibTime线程的对象传递给MakeFibonacci构造函数并将其分配给MakeFibonacci的成员。以相同的方式停止此线程..
答案 1 :(得分:0)
你可以做的一件事是:
CountDownLatch
这可以按照您的意图使用。 Thread.sleep()
是为了确保两个线程同时启动。然而,有几点是缺乏的。
shceduledExecutors
不是最好的解决方案。您可以使用volatile
请注意{{1}}。如果它不是易失性的,它将无法正常工作。 (至少没有同步)。