Scanner.nextInt() 块

Scanner.nextInt() blocks

提问人:msk 提问时间:1/22/2016 最后编辑:msk 更新时间:1/27/2016 访问量:896

问:

如果采用以下方式,我的代码工作正常。

Scanner input = new Scanner(System.in);
ExecutorService executor = Executors.newFixedThreadPool(2);
for (int i = 0; i < 3; i++) 
{
     Runnable worker = new ClassA();
     executor.execute(worker);
} 

相反,我想在循环中连续运行,并在用户输入 1 时中断循环。我尝试了以下方法,但它不起作用。它不是连续运行,而是在这条线上停止(阻塞)谁能告诉我错误在哪里。无论是否是正确的做法,如果不是,请提出替代方案。我在类 A 中的代码连接到队列,并且应该从队列中持续读取消息。while(true)int stop = input.nextInt();jms queue

Scanner input = new Scanner(System.in);
ExecutorService executor = Executors.newFixedThreadPool(2);
while(true)
{
     Runnable worker = new ClassA();
     executor.execute(worker);
     int stop = input.nextInt();
     if(stop == 1) {
            break;
     }
 }

编辑:以下是编辑后的代码。当 scanner.nextInt() 值为 1 时,finished = true。While(!finished) 循环中断,其中的代码未执行,但我的 Consumer 类仍在连续运行。

public class ScannerProblem {
   public static boolean finished = false;
   static class Listener implements Runnable {
      Scanner scanner = new Scanner(System.in);
      @Override
        public void run() {
            while (true) {
                System.out.println("scanning");
                if (scanner.nextInt() == 1) {
                    System.out.println("scanning finished");
                    finished = true;
                    return;
                } else {
                    System.out.println("scanned something strange");
                    try {
                        Thread.sleep(1500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    static class Consumer implements Runnable {
        javax.jms.Connection jmsConnection = null;
        private static ProcessRequest processRequest = new ProcessRequest();
        @Override
        public void run() {
            ActiveMQConnection con = new ActiveMQConnection();
            jmsConnection = con.openTcpConnection();
            try {
                String json = null;
                Session session = jmsConnection.createSession(false,
                        Session.AUTO_ACKNOWLEDGE);
                Queue queue = session.createQueue("Upload_Queue");
                MessageConsumer consumer = session.createConsumer(queue);
                TextMessage message = (TextMessage) consumer.receive();
                System.out.println("Message #" + ": " + message.getText());
                json = message.getText();
                processRequest.upload(json);
                System.out.println("Thread ID: " +                 Thread.currentThread().getId());

            if (jmsConnection != null) {

                    jmsConnection.close();
            }

            Thread.sleep(5000);
        }
            catch(JMSException e) {
                e.printStackTrace();
            }
            catch(InterruptedException e){
                e.printStackTrace();
            }
            catch(Exception e) {
                e.printStackTrace();
            }
            }
    }



    public static void main(String[] args) {
        ExecutorService pool = Executors.newFixedThreadPool(2);
        pool.submit(new Listener());

        while (!finished) {
            System.out.println("finished::"+finished);
            pool.submit(new Consumer());
            try {
                Thread.sleep(4000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
Java 多线程 java.util.scanner executorservice

评论

1赞 Fildor 1/22/2016
nextInt正在阻塞。这意味着它正在等待用户输入。同时,线程停滞不前。您可能想在此处更改您的设计。我想你应该在你的工人内部提供“连续性”,而不是不断地将工人添加到队列中......

答:

0赞 user2189998 1/22/2016 #1

int stop = input.nextInt() 是一个阻塞调用,因此它只执行一次 ClassA runnable,然后等待输入。

您需要将输入代码移动到另一个线程,这样它就不会阻止 ClassA 的执行。

也许更好的选择是只执行一次 ClassA,并在其中设置另一个 while(true) 循环。