Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重复重置新线程_Java_Multithreading_Reset - Fatal编程技术网

Java 重复重置新线程

Java 重复重置新线程,java,multithreading,reset,Java,Multithreading,Reset,在我的程序中,有一个按钮“显示”,另一个按钮“重置”。 用户在文本字段中输入所需的质数,然后单击“显示”按钮。然后,第一个x素数将出现在文本区域中 在守则中,我有: 声明: Thread go; Thread newThread; JLabel howManyLabel; JTextField howMany; JButton display; JButton reset; JTextArea primes; 行动事件: public void actionPerformed(ActionEv

在我的程序中,有一个按钮“显示”,另一个按钮“重置”。 用户在文本字段中输入所需的质数,然后单击“显示”按钮。然后,第一个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(" ");
    }
}
运行方法:

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++;
    }
}
public void run(){
int quantity=Integer.parseInt(hown.getText());
int numPrimes=0;
int candidate=2;//candidate=可能是素数的数字
附加(“第一个”+数量+”素数:);
while(numPrimes<数量){
如果(iPrime(候选)){
primes.append(候选者+“,”);
numPrimes++;
}
候选人++;
}
}
run()方法在同一个类中,只计算质数的前x个数量

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

提前感谢。

run()方法与任何其他方法一样,可以调用任意次数。不能多次调用的方法是
start()
(根据)

你的解释似乎与你给出的代码不符。当用户单击“重置”时,您说希望生成一个新线程,但只有在源代码为Display时,您才构造或启动线程。您的意思是,您想取消最后一个线程,并为用户重新启动启用控件吗?在这种情况下,您应该使用
未来的
,而不是通用线程


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

否,每次启动该线程时都会运行run方法。可能需要重新初始化
run()
中的代码?
run()
中的代码有什么作用?请添加
display、go、newThread、howmount、,素数
运行的主体
,这样我们就可以了解发生了什么…请命名比
go
newThread
更有意义的线程变量!我想你不是说每次按下“重置”按钮时都要创建一个新线程吧?看起来你只是想重置你的UI。你应该重新表述你的问题来表达你的真实意图。我将如何使用未来?你将创建并运行一个实现类。如果使用Swing,您将创建一个可以在其中实现
doInBackground()
,这将是主要的工作负载。每次它发现一个新的素数时,它都会使用
publish
将它交给EDT。然后,它将调用EDT(GUI线程)中已发布位的
process
,用新编号更新文本区域。完成后,它将再次在EDT上调用
done
,完成线程。它还有一个可停止的取消方法。其他选项包括使用
ScheduledExecutorService
,这实际上取决于您使用的框架和库。主要的问题仍然存在——调试器告诉了你什么?在线程是否生成或它执行的操作方面是否存在问题?调试器说:线程“Thread-3”java.lang.NumberFormatException中的异常:对于输入字符串:“7”位于java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)位于java.lang.Integer.parseInt(Integer.java:481)位于java.lang.Integer.parseInt(Integer.java:527)在PrimeFinder.run(PrimeFinder.java:80)在java.lang.Thread.run(Thread.java:744)请将堆栈跟踪作为代码发布,否则格式很糟糕。但是我注意到在7之前有一个空格,这会破坏解析器。我想这是您之前遇到的问题。我要做的是将测试字段设置为“”而不是“”(空字符串,不是空格),并将
parseInt()
放在try-catch块中。这样,您就可以指示线程是否由于某些奇怪的原因而未启动,或者它只是无法识别数字