Java 重复重置新线程
在我的程序中,有一个按钮“显示”,另一个按钮“重置”。 用户在文本字段中输入所需的质数,然后单击“显示”按钮。然后,第一个x素数将出现在文本区域中 在守则中,我有: 声明: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
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块中。这样,您就可以指示线程是否由于某些奇怪的原因而未启动,或者它只是无法识别数字