提问人:msk 提问时间:1/22/2016 最后编辑:msk 更新时间:1/27/2016 访问量:896
Scanner.nextInt() 块
Scanner.nextInt() blocks
问:
如果采用以下方式,我的代码工作正常。
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();
}
}
}
}
答:
0赞
user2189998
1/22/2016
#1
int stop = input.nextInt() 是一个阻塞调用,因此它只执行一次 ClassA runnable,然后等待输入。
您需要将输入代码移动到另一个线程,这样它就不会阻止 ClassA 的执行。
也许更好的选择是只执行一次 ClassA,并在其中设置另一个 while(true) 循环。
评论
nextInt
正在阻塞。这意味着它正在等待用户输入。同时,线程停滞不前。您可能想在此处更改您的设计。我想你应该在你的工人内部提供“连续性”,而不是不断地将工人添加到队列中......