如何使用静态类中的线程实现停止条件

时间:2017-04-21 00:10:09

标签: java multithreading

我正在开展一个项目,但我在停止该计划时遇到了一些困难。我使用线程而不是计时器,因为我觉得它更容易使用。基本上,我现在遇到的问题是从主函数到静态函数的时间。任何帮助,将不胜感激。如果我的问题不清楚,我会在评论中包含代码的重要部分。 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.");
    }

}

1 个答案:

答案 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;
    }
}