使用Scanner的next()方法,它可以以空格结束,可以实现在一行内输入所有。
你程序中用到的Scanner的nextLine()方法是遇到换行符结束,所以必须要换行输入。
scanner.nextLine() 是读取一整行的数据,包括空格,以换行分隔
换成 scanner.next() 吧,它是读取字符串,以空格分隔
我们分析一下,很容易想到是因为,await被唤醒之后是从await的地方继续执行,那么直接从else出走掉了,假如那是消费者的最后一轮循环,那么那个最后一轮循环的线程就结束了,生产者还有一轮或者多伦循环没有结束,生产者线程生产出的商品就没有线程去消费就会一直等待。
针对问题: 当输入数据时需要分多行输入,如何只输入一行全部数据?
解决方案: 如果你是基于命令行的输入,可以使用Scanner.next()方法来获取一行中的所有数据,然后根据具体的类型进行数据的处理。示例代码如下:
import java.util.Scanner;
public class InputOptimize {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 输入一行数据
String line = scanner.nextLine();
String[] items = line.split(",");
// 根据具体类型进行数据处理
for (String item : items) {
System.out.println(item);
}
}
}
该程序中,运用Scanner.nextLine()方法获取输入的这一行数据,然后根据逗号来切分整个字符串,最后进行数据的处理。
如果你是通过IDE, Web Application等工具来进行数据输入,那么你需要在提供数据的地方将多个输入项拼接成一个字符串,然后在程序中对该字符串进行数据的处理。
举例来说,在Web工具中,我们可以通过Textarea这个标签来输入一行数据。在工具提供的服务端代码中,我们可以根据HTTP请求实体中的参数获取该数据,示例如下:
@RestController
public class DemoController {
@RequestMapping("/optimize")
public String getData(HttpServletRequest request) {
String data = request.getParameter("data");
String[] items = data.split(",");
StringBuilder builder = new StringBuilder();
// 根据具体类型来做数据处理
for (String item : items) {
builder.append(item).append("\n");
}
return builder.toString();
}
}
我们可以在Textarea中将多行数据换成一个字符串,代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>数据输入</title>
</head>
<body>
<form action="/optimize" method="post">
<textarea name="data" id="data" cols="30" rows="10"></textarea>
<br>
<button type="submit">提交</button>
</form>
</body>
</html>
上述代码中,我们通过提交表单来将Textarea中的数据传递到服务端,然后使用HttpServletRequest.getParameter()来获取该数据。最后根据具体类型进行数据的处理并返回给前端页面。