我必须为学校制作DieTester。一个掷骰子100次,然后将输出放在表格图表和另一个表格中。 问题是我的Thread不会在Slider设置的时间内睡觉。 在这里,我的DieTester:
package sample.Controllers;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.RunnableFuture;
public class DieTester implements Runnable{
private Thread t;
private String Threadname;
List<Integer> List = new ArrayList();
Random rand = new Random();
long l;
public DieTester(String name){
Threadname = name;
}
public void run() {
for (int n = 0; n < 100; n++) {
try {
Thread.sleep(getTime());
List.add(rand.nextInt(6) + 1);
System.out.println(List.get(n));
} catch (InterruptedException e) {
System.out.println("Error");
}
}
}
public void start(){
if (t == null)
{
t = new Thread (this, Threadname);
t.start ();
}
}
public void setTime(double SliderTime){
l = (long) SliderTime;
}
public long getTime(){
return l;
}
}
这里是控制器:
package sample.Controllers;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.Slider;
public class Controller {
DieTester dice = new DieTester("Time");
double time=0;
EventHandler e = new EventHandler() {
@Override
public void handle(Event event) {
time = TimeSlider.getValue();
}
};
@FXML
Slider TimeSlider = new Slider(50, 2000, 50);
@FXML
public void HandlePauseResumeAction(){
}
@FXML
public void HandleStartAction(){
DieTester die = new DieTester("Start");
die.start();
}
@FXML
public void HandleSlider(){
TimeSlider.valueProperty().addListener((observable, oldValue, newValue) -> {
time = TimeSlider.getValue() * 20;
//System.out.println(time);
dice.setTime(time);
});
System.out.println(dice.getTime());
}
}
滑块和所有内容都已正确设置。如果我调用getTime()它会正确地计算出时间,但线程并没有睡觉或者什么。
答案 0 :(得分:1)
这是一个可变的共享变量:
long l
线程同时访问它(一个读取,一个写入),但它没有正确的同步,因此不保证一个线程的写入被另一个线程看到。
最重要的是,l被初始化为0,并且在第一次属性更改事件发生之前,产生的线程已经通过100个循环进行了比赛而没有真正睡眠。
答案 1 :(得分:0)
好的家伙所以我明白了,这就是我做的事情
@FXML
public void HandleStartAction(){
start();
}
public void run(){
for(int n = 0; n < 100; n++){
try {
if(!suspend){
Thread.sleep((long)TimeSlider.getValue() * 20);
List.add(rand.nextInt(6) + 1);
System.out.println(List.get(n));
}else{
}
} catch (InterruptedException e) {
System.out.println("Error");
}
}
}
public void start(){
if (t == null)
{
t = new Thread (this, "Start");
t.start ();
}
}