gpt4 book ai didi

java - 如何使用不同类的按钮停止或 hibernate 线程

转载 作者:行者123 更新时间:2023-11-29 07:01:52 27 4
gpt4 key购买 nike

假设我在 twitterpanel 类 中创建了一个带有按钮的线程

public class twitterpanel extends javax.swing.JFrame {
Thread oto;
/....
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
oto = new Thread(new Runnable() {

@Override
public void run() {
ArrayList<String> textler = new ArrayList<String>();
textler.add(jTextField1.getText());
textler.add(jTextField2.getText())

new Twitter(textler);

}
});
oto.start();
} }

方法是,例如:

  public void twittermethod() { 
for (;;) {
System.out.println("Close me please..");
}

}

我想用另一个按钮关闭此线程,该按钮位于 twitterpanel class 中。也许这很简单,但我找不到任何东西,就像我的大脑停止了一样。希望我能清楚地解释自己。提前致谢..

最佳答案

同样,如您的 prior deleted question 中所述,

  1. 您的代码不是线程安全的,因为您进行的 Swing 调用会改变 Swing 事件线程之外的 Swing 组件的状态。
  2. 您的问题是 XY Problem因为您询问的是可能错误的特定代码解决方案,并且您没有讨论您的总体目标。

    • 您会想阅读这篇关于 Swing 线程安全的文章:Concurrency in Swing .
    • 您应该考虑更详细地了解您希望用户使用您的 GUI 体验哪些行为,这样我们或许能够提供更好、更稳健的解决方案。
    • 为了获得更好的帮助,请考虑创建并发布 minimal example program ,供我们审查、测试并可能修复的代码。

例如,您通常可以使用 SwingWorker 后台线程启动和停止线程。有关如何使用此工具的详细信息,请阅读我在上面链接的 SwingWorker 教程,您可以找到该教程 here .

一个带有 SwingWorker 的最小 Swing 程序示例,它可以完成您想要做的事情(我认为!):

import java.awt.event.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class StopThreadGui extends JPanel {
private JTextField field1 = new JTextField("Hello", 10);
private JTextField field2 = new JTextField("Goodbye", 10);
private JButton startButton = new JButton(new StartAction("Start", KeyEvent.VK_S));
private JButton endButton = new JButton(new EndAction("End", KeyEvent.VK_E));
private MySwingWorker myWorker;

public StopThreadGui() {
add(field1);
add(field2);
add(startButton);
add(endButton);
}

private static void createAndShowGui() {
StopThreadGui mainPanel = new StopThreadGui();

JFrame frame = new JFrame("StopThreadGui");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}

private class StartAction extends AbstractAction {
public StartAction(String name, int mnemonic) {
super(name);
putValue(MNEMONIC_KEY, mnemonic);
}

@Override
public void actionPerformed(ActionEvent evt) {
if (myWorker != null && !myWorker.isDone()) {
return;
}
String text1 = field1.getText();
String text2 = field2.getText();

myWorker = new MySwingWorker(text1, text2);
myWorker.execute();
}
}

private class EndAction extends AbstractAction {
public EndAction(String name, int mnemonic) {
super(name);
putValue(MNEMONIC_KEY, mnemonic);
}

@Override
public void actionPerformed(ActionEvent evt) {
if (myWorker == null || myWorker.isDone()) {
return;
}
myWorker.cancel(true);
}
}

}

class MySwingWorker extends SwingWorker<Void, Void> {
private static final long SLEEP_TIME = 400;
private String text1;
private String text2;

public MySwingWorker(String text1, String text2) {
this.text1 = text1;
this.text2 = text2;
}

@Override
protected Void doInBackground() throws Exception {
boolean foo = true;
while (foo) {
System.out.printf("Text1: %s; Text2: %s%n", text1, text2);
System.out.println("Close me please..");
Thread.sleep(SLEEP_TIME);
}
return null;
}
}

关于java - 如何使用不同类的按钮停止或 hibernate 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24708617/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com