【发布时间】:2018-10-25 08:07:43
【问题描述】:
无法停止线程Midway和重启添加节点线程。
这就是我得到的
这就是我需要的每当我按下刷新按钮
时,我都想要这样的东西清屏和重启(例如。A到N按正确顺序)
为什么?所以我可以在刷新之前选择不同的列表。
背景故事 (忽略) 从一个月开始,我正在研究一个关于 JavaFX 的小项目,但这个问题困扰着我。我做了我的研究并试图弄清楚但没有。如果有人引导我走上正确的道路,我真的很感激。请突出显示这个问题,这样其他人就不必浪费太多时间了
我有 JavaFX 控制器
@FXML public FlowPane flow_panel;
MyPlatform mp = new MyPlatform(); // A class that implements Runnable
Thread t;
boolean first_time_click = true; // To check Whether i clicked '1st' time or 'second' time
@FXML
private void Refresh_Btn(ActionEvent event)
{
System.out.println("Refresh btn");
t = new Thread(mp); //Creating Thread object
if(first_time_click == true) { first_time_click = false;
MyPlatform.stop = false; //Thread object.Stop, When false do nothing
flow_panel.getChildren().clear(); // cleaning screen
System.out.println("Start Thread");
t.setDaemon(true);
t.start(); //Start Thread
} else if(first_time_click == false){ first_time_click = true;
MyPlatform.stop = true; //Exist loop
t.interrupt(); // I thought 't.interrupt()' it work but nothing
System.out.println("Stop Thread");
flow_panel.getChildren().clear(); // cleaning screen
MyPlatform.stop = false; //Thread object.Stop, When false do nothing
t.setDaemon(true);
t.start(); //Start Thread
System.out.println("Stoped Thread Started again");
}
}
然后我有一个名为 MyPlatform 的类,它实现了 Runnable
import javafx.application.Platform;
import javafx.scene.control.Button;
import setups.WindowSetupConfig;
public class MyPlatform implements Runnable
{
public static boolean stop = false;
@Override
public void run()
{
for (String name : ListOfNames.getlist())
{
if(stop) // Exit for loop if true
{
break;
}
Platform.runLater(new Runnable()
{
@Override
public void run()
{
Button btn = new Button("Button : "+name);
System.out.println(name);
//Adding that button to FlowPane
WindowSetupConfig.getController().flow_panel.getChildren().add(btn);
}
});
try {
Thread.sleep(1000); // Wait for 1 sec, Controlling speed
} catch (InterruptedException e) { // try catch it needed for some reason
e.printStackTrace();
}
}
}
}
我有一个字符串列表。最初,该列表将包含 500 多个名称
import java.util.ArrayList;
public class ListOfNames
{
private static ArrayList<String> list_of_names ;
public ListOfNames()
{
list_of_names = new ArrayList<>();
list_of_names.add("A");
list_of_names.add("B");
list_of_names.add("C");
list_of_names.add("D");
list_of_names.add("E");
list_of_names.add("F");
list_of_names.add("G");
list_of_names.add("H");
list_of_names.add("I");
list_of_names.add("J");
list_of_names.add("K");
list_of_names.add("L");
list_of_names.add("M");
list_of_names.add("N");
}
public static ArrayList<String> getlist() {
return list_of_names;
}
}
使用 flow_panel.getChildren().clear(); 清理 FlowPane; 并从列表的开头重新开始
基本 -停止 -清洁 -重启
如果有任何方法可以通过 Service 或 task 做到这一点,那就太好了
【问题讨论】:
-
请提供一个minimal reproducible example 来说明问题。与您的问题无关:请学习 java 命名约定并遵守它们
-
基本上,您取消任务,进行清理工作,然后开始新任务 - 或者我错过了什么?
-
@kleopatra 是的,取消任务,清理并重新启动它,完全正确。这就是我无法取消或停止线程的问题
-
您不能依赖
MyPlatform.stop的更改值对执行分配的线程以外的线程可见,因为它不是volatile,因此可以为每个线程创建一个副本。此外,它是static,因此如果您运行多个MyPlatform,所有这些都将被“取消”(假设他们收到消息)。 -
不是重新开始,创建并开始一个新的..@fabian 所有这些静态访问器无论如何都必须去;)
标签: java multithreading javafx javafx-8 fxml