我正在开展一个项目,但我在停止该计划时遇到了一些困难。我使用线程而不是计时器,因为我觉得它更容易使用。基本上,我现在遇到的问题是从主函数到静态函数的时间。任何帮助,将不胜感激。如果我的问题不清楚,我会在评论中包含代码的重要部分。 TIA
import java.util.Random;
import java.util.Scanner;
import javax.swing.JOptionPane;
public class InLineCustomers {
@SuppressWarnings("static-access")
public static void main (String args[]){
try{
final long NANOSEC_PER_SEC = 1000l*1000*1000;
long startTime = System.nanoTime();
long time = (System.nanoTime()-startTime);
final long genTime=3*60*NANOSEC_PER_SEC;
while (time<genTime){ //Program runs for 3 minutes
customerGenerator();
Random r = new Random();
int timeValue=r.nextInt(10);
Thread.currentThread().sleep(timeValue * 1000);
}
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void customerGenerator(){
...code here
if(selection.equalsIgnoreCase("C")){
/**This doesn't working because the customerGenerator is in it's own static class
* Would the program be more difficult to read if I had everything in the main method?
* That's what I'm trying to avoid
*
* time=genTime;
JOptionPane.showMessageDialog(null,"The restaurant is no longer accepting any customers.");
*/
stop(); //This isn't working because it created a different timer
}
}
public static void stop(){
final long NANOSEC_PER_SEC = 1000l*1000*1000;
long startTime = System.nanoTime();
long time = (System.nanoTime()-startTime);
final long genTime=3*60*NANOSEC_PER_SEC;
time=genTime;
JOptionPane.showMessageDialog(null,"The restaurant is no longer accepting any customers.");
}
}
答案 0 :(得分:0)
这显示了您可以与线程通信的几种方式,也许最相关的是使用java.util.concurrent.atomic
变量将数据传递给线程。
public static void main(String[] args) {
final java.util.concurrent.atomic.AtomicLong timer = new java.util.concurrent.atomic.AtomicLong((long)(Math.random() * 1000));
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
long timeValue = timer.get();
do {
System.out.println("Customer does something");
Thread.currentThread().sleep(timeValue);
timeValue = timer.get();
} while (0 != timeValue);
}
catch(InterruptedException interrupt) {
// whatever;
}
System.out.println("Parent says we're all done");
}
});
thread.start();
try {
Thread.currentThread().sleep((long)(Math.random() * 10 * 1000));
boolean do_it_the_easy_way = true;
if (do_it_the_easy_way) {
thread.interrupt();
} else {
timer.set(0);
}
}
catch(InterruptedException interrupt) {
System.out.println("Program halted externally");
return;
}
}