Java 如何使用2个按钮使多线程swing gui应用程序启动/停止线程
我有一个单独的类实现runnable,但是每当我启动线程时,我都不能按下GUI上的stop按钮。我不确定我是否做得正确,因为我以前在这种规模的Java项目中从未做过多线程。我已经深入这个项目,直到现在我还没有测试停止线程功能 我研究过如何实现这样的事情,但我不确定如何实现: 这些是启动和停止线程的代码位Java 如何使用2个按钮使多线程swing gui应用程序启动/停止线程,java,multithreading,swing,Java,Multithreading,Swing,我有一个单独的类实现runnable,但是每当我启动线程时,我都不能按下GUI上的stop按钮。我不确定我是否做得正确,因为我以前在这种规模的Java项目中从未做过多线程。我已经深入这个项目,直到现在我还没有测试停止线程功能 我研究过如何实现这样的事情,但我不确定如何实现: 这些是启动和停止线程的代码位 Runnable r; Thread t1; String token,proxies,sID,msgC; 这就是我在另一个线程中初始化的类的样子 public class BotFunc i
Runnable r;
Thread t1;
String token,proxies,sID,msgC;
这就是我在另一个线程中初始化的类的样子
public class BotFunc implements Runnable {
private String token1,proxies1,sID1,msgC1;
public BotFunc(String token,String proxies,String sID,String msgC) {
token1=token;proxies1=proxies;sID1=sID;msgC1=msgC;
run();
}
public void run()
{
{
{
System.out.println("t1 running");
//there were about 1000 lines here that I deleted in which I start 2 other threads
}
}
}
}
你也可以看到我在哪里写“/”我在这里删除了大约1000行,其中我启动了另外两个线程。“初始化的类与BotFunc类非常相似,我想知道如何中断这些线程。我想问题在于调用
run()
来自BotFunc
的构造函数:
public BotFunc(String token,String proxies,String sID,String msgC) {
token1=token;proxies1=proxies;sID1=sID;msgC1=msgC;
run(); // <---- DON'T DO THIS!!
}
从ctor调用
run()
会导致GUI线程运行Runnable
,因为调用ctor的是GUI线程,而ctor的主体只是在GUI线程上执行。我无法按下GUI上的停止按钮。
GUI是否仍在运行?通常这意味着您已经阻止了主GUI线程。上面的方法调用在任何时间段内都执行吗?我不确定。GUI并没有完全冻结,但我不能按任何按钮。我可以移动它,不像我以前使用的C++应用程序完全冻结。移动主窗口是由OS处理的,我不认为java被牵涉进来。只是处理GUI和事件的另一种方式,Java让操作系统处理一些窗口函数。我可以做什么呢?只是不要调用run()
。你为什么要这么做?当您调用Thread.start()
时,代码将被执行,无需在ctor中运行此命令。
public class BotFunc implements Runnable {
private String token1,proxies1,sID1,msgC1;
public BotFunc(String token,String proxies,String sID,String msgC) {
token1=token;proxies1=proxies;sID1=sID;msgC1=msgC;
run();
}
public void run()
{
{
{
System.out.println("t1 running");
//there were about 1000 lines here that I deleted in which I start 2 other threads
}
}
}
}
public BotFunc(String token,String proxies,String sID,String msgC) {
token1=token;proxies1=proxies;sID1=sID;msgC1=msgC;
run(); // <---- DON'T DO THIS!!
}
/* Fake Thread implementation */
public class Thread {
public void start() {
/* starts a new thread, then... */
run(); // just calls run()
}
}