在循环中睡眠线程

时间:2016-06-13 08:10:34

标签: java multithreading

我必须为学校制作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()它会正确地计算出时间,但线程并没有睡觉或者什么。

2 个答案:

答案 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 ();

    }
}