2014-04-04 40 views
0

在我的程序中,有一个按钮“Display”,另一个按钮“Reset”。 用户在文本字段中输入他们想要的素数的数量,然后单击“显示”按钮。然后,第一个x素数将出现在文本区域中。重新设置新线程

在代码中,我有: 声明:

Thread go; 
Thread newThread; 
JLabel howManyLabel; 
JTextField howMany; 
JButton display; 
JButton reset; 
JTextArea primes; 

操作事件:

public void actionPerformed(ActionEvent event) { 
    Object source = event.getSource(); 

    if (source == display) { 
     display.setEnabled(false); 
     if (go == null) { 
      go = new Thread(this); 
      go.start(); 
     } else { 
      newThread = new Thread(this); 
      newThread.start(); 
     } 
    } else if (source == reset) { 
     display.setEnabled(true); 
     howMany.setText(" "); 
     primes.setText(" "); 
    } 
} 

Run方法:

public void run() { 
    int quantity = Integer.parseInt(howMany.getText()); 
    int numPrimes = 0; 
    int candidate = 2; // candidate = the number that MIGHT be prime 

    primes.append("First " + quantity + " primes:"); 
    while(numPrimes < quantity) { 
     if (isPrime(candidate)) { 
      primes.append(candidate + ", "); 
      numPrimes++; 
     } 
     candidate++; 
    } 
} 

的run()方法是在同类,并简单地计算素数的前x个数量。

我试图每次调用“重置”按钮时创建一个新的线程。线程第一次运行,但在单击“重置”后不会再运行。 run()方法只能工作一次吗?

在此先感谢。

+1

不,每次启动线程时都会运行run方法。也许'run()'中的代码需要重新初始化? – Gray

+0

run()中的代码是做什么的? – csharpwinphonexaml

+0

请为'display,go,newThread,howMany,primes'和'run'的主体添加成员变量声明,以便我们能够理解正在发生的事情... – japreiss

回答

0

run()方法就像任何其他方法一样,可以调用任意次数。无法多次调用的方法是start()(根据Thread)。

您的解释似乎不符合您提供的代码。你说你想在用户点击重置时产生一个新线程,但是如果源是Display,你只会构造或启动线程。你的意思是,你想取消最后一个线程并为用户启用控件以重新启动?在这种情况下,您应该使用Future,而不是通用线程。

另一件事是UI组件通常不是线程安全的。 Swing在每个组件JavaDoc上明确警告它。你可能会看到的只是组件不更新其可见状态时,从不同的线程更改。您是否尝试过使用调试器来查看一个线程是否实际上不会生成,或者正在生成,但没有您想要的结果?

+0

我将如何使用未来? – vmck

+0

您将创建并运行其中一个实现类。 如果使用Swing,你可以创建一个[SwingWorker](http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html),你可以在其中实现'doInBackground()',将是主要的工作量。每次它发现一个新的素数时,它都会使用'publish'将它提供给EDT。然后它会在EDT(GUI线程)的已发布位上调用“process”,并用新的数字更新文本区域。当它完成时,它会再次调用EDT上的'done',完成线程。它也有一个取消方法来停止。 – Ordous

+0

其他选项包括使用'ScheduledExecutorService',它实际上取决于您正在使用的框架和库。 主要问题仍然存在 - 调试器告诉你什么? Thread是否会产生问题,或者产生了什么问题? – Ordous