用java写一个程序,在主线程中打印N个字母A,在子线程中打印N个字母B。 调整N的取值,观察输出结果的情况。
时间: 2024-05-01 18:16:19 浏览: 16
```java
public class Main {
public static void main(String[] args) {
int N = 5;
Thread threadB = new Thread(() -> {
for (int i = 0; i < N; i++) {
System.out.print("B");
}
});
threadB.start();
for (int i = 0; i < N; i++) {
System.out.print("A");
}
}
}
```
当N=5时,可能的输出如下:
```
AAAAABBBBB
ABABABABAB
AABBAABBBB
```
可以看到,由于主线程和子线程的执行顺序不确定,输出的结果也不确定。有时候A和B交替出现,有时候A和B连续输出。
相关问题
编写一个java应用程序,在主线程中再创建两个线程,一个线程负责给出键盘上的字母,另一个线程负责让用户在命令行输入所给出的字母。
### 回答1:
这是一个多线程的Java应用程序,主线程中创建了两个子线程。一个线程用于读取键盘上的字母,另一个线程用于让用户在命令行输入所给出的字母。
代码示例:
```java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// 创建一个字母读取线程
Thread readThread = new Thread(new ReadLetter());
// 创建一个字母输入线程
Thread inputThread = new Thread(new InputLetter());
// 启动两个线程
readThread.start();
inputThread.start();
}
}
// 读取键盘上的字母
class ReadLetter implements Runnable {
@Override
public void run() {
Scanner scanner = new Scanner(System.in);
while (true) {
// 读取一个字母
char letter = scanner.next().charAt();
// 将字母发送给输入线程
InputLetter.receiveLetter(letter);
}
}
}
// 让用户在命令行输入所给出的字母
class InputLetter implements Runnable {
private static char letter;
// 接收字母
public static void receiveLetter(char c) {
letter = c;
}
@Override
public void run() {
while (true) {
// 输出提示信息
System.out.print("请输入字母:");
// 等待用户输入
Scanner scanner = new Scanner(System.in);
char input = scanner.next().charAt();
// 判断输入是否正确
if (input == letter) {
System.out.println("输入正确!");
} else {
System.out.println("输入错误!");
}
}
}
}
```
### 回答2:
这个Java应用程序可以通过使用Java中的Thread类和Runnable接口来实现多线程编程。在主线程中,我们可以先创建一个Runnable对象,用于建立一个接受用户输入的线程。代码如下:
```
Runnable inputRunnable = new Runnable() {
public void run() {
Scanner scanner = new Scanner(System.in);
while (true) {
if (scanner.hasNext()) {
String input = scanner.next();
// 处理用户输入的逻辑
// ...
}
}
}
};
Thread inputThread = new Thread(inputRunnable);
```
接下来,我们可以创建另一个Runnable对象,用于建立一个产生键盘输入的线程。代码如下:
```
Runnable outputRunnable = new Runnable() {
public void run() {
try {
Robot robot = new Robot();
while (true) {
List<Character> characters = Arrays.asList('a', 'b', 'c', 'd', 'e');
char c = characters.get((int)(Math.random() * characters.size()));
robot.keyPress(Character.toUpperCase(c));
robot.keyRelease(Character.toUpperCase(c));
Thread.sleep(1000);
}
} catch (AWTException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
Thread outputThread = new Thread(outputRunnable);
```
在这个Runnable对象中,我们使用了Java的Robot类来模拟键盘输入。其中List<Character> characters定义了可选的字母,通过Math.random() * characters.size()方法来取得随机字母。在Robot类中,我们可以使用keyPress()和keyRelease()方法来模拟按下和松开一个键,这里我们使用Character.toUpperCase()方法将字母转换为大写字母方便后续处理。
最后,在主线程中,我们可以启动这两个线程。代码如下:
```
inputThread.start();
outputThread.start();
```
通过这个Java应用程序,我们可以将产生的随机字母显示在屏幕上,用户可以在命令行窗口中输入相应的字母进行处理。如果需要对用户输入的字母进行处理,可以在inputRunnable的run()方法中进行相应的逻辑编写。
### 回答3:
实现这个需求可以分为三个步骤,首先是监听键盘输入,其次是创建线程,最后是线程间的通信。
一、监听键盘输入
Java提供了一个Scanner类用于读取键盘输入。我们可以在主线程中创建一个Scanner对象,然后循环向控制台输入,实时监听键盘输入。
```java
Scanner scanner = new Scanner(System.in);
while (true) {
String str = scanner.nextLine();
// 将str发送给接收线程
}
```
二、创建线程
接下来在主线程中创建两个线程:一个线程用于发送键盘输入,另一个用于接收命令行输入。可以使用Java中的Thread类来实现线程的创建和启动。
```java
Thread senderThread = new Thread(new SenderRunnable());
Thread receiverThread = new Thread(new ReceiverRunnable());
senderThread.start();
receiverThread.start();
```
三、线程间的通信
在两个线程之间进行通信,可以使用Java中的wait()和notify()方法。发送线程会将键盘输入的内容发送给接收线程,并让接收线程等待通知。
```java
class SenderRunnable implements Runnable {
public void run() {
Scanner scanner = new Scanner(System.in);
while (true) {
String str = scanner.nextLine();
synchronized (Main.lock) {
Main.message = str;
Main.lock.notify();
}
}
}
}
class ReceiverRunnable implements Runnable {
public void run() {
while (true) {
synchronized (Main.lock) {
try {
Main.lock.wait();
System.out.println("收到消息:" + Main.message);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
```
最后,在Main类定义一个静态变量lock和message,作为线程间的同步通信关键字和消息传递载体,用于控制线程的交互。
完整代码:
```java
import java.util.Scanner;
public class Main {
public static Object lock = new Object();
public static String message;
public static void main(String[] args) {
Thread senderThread = new Thread(new SenderRunnable());
Thread receiverThread = new Thread(new ReceiverRunnable());
senderThread.start();
receiverThread.start();
}
static class SenderRunnable implements Runnable {
public void run() {
Scanner scanner = new Scanner(System.in);
while (true) {
String str = scanner.nextLine();
synchronized (lock) {
message = str;
lock.notify();
}
}
}
}
static class ReceiverRunnable implements Runnable {
public void run() {
while (true) {
synchronized (lock) {
try {
lock.wait();
System.out.println("收到消息:" + message);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
```
编写一个Java应用程序,在主线程中再创建两个线程,一个线程负责给出键盘上字母键上的字母,另一个线程负责用户在命令行中输入所给出的字母。
以下是一个可能的Java应用程序,其中包括一个主线程和两个子线程,一个用于读取键盘上的字母,另一个用于读取命令行输入。
```java
import java.util.Scanner;
public class KeyboardInputThread extends Thread {
@Override
public void run() {
Scanner scanner = new Scanner(System.in);
String input = scanner.next();
System.out.println("You typed: " + input);
}
}
public class CommandLineInputThread extends Thread {
private String letter;
public CommandLineInputThread(String letter) {
this.letter = letter;
}
@Override
public void run() {
Scanner scanner = new Scanner(System.in);
String input = scanner.next();
if (input.equals(letter)) {
System.out.println("Correct!");
} else {
System.out.println("Incorrect!");
}
}
}
public class MainThread {
public static void main(String[] args) {
KeyboardInputThread keyboardInputThread = new KeyboardInputThread();
CommandLineInputThread commandLineInputThread = new CommandLineInputThread("a");
keyboardInputThread.start();
commandLineInputThread.start();
}
}
```
在这个例子中,`KeyboardInputThread`类继承了`Thread`类,并覆盖了其`run()`方法。在`run()`方法中,它使用`Scanner`类从键盘中读取用户输入,并将其输出到控制台。
`CommandLineInputThread`类也继承了`Thread`类,并使用了一个构造函数来传递要匹配的字母。在`run()`方法中,它读取命令行输入并检查它是否与传递的字母匹配,并将结果输出到控制台。
在`MainThread`类中,我们创建了一个`KeyboardInputThread`实例和一个`CommandLineInputThread`实例,并分别启动它们的线程。这将导致两个子线程同时运行,并在后台读取用户输入。当用户在键盘上输入字母时,`KeyboardInputThread`子线程将会输出它,而当用户在命令行中输入字母时,`CommandLineInputThread`子线程将会检查它是否与预期的字母匹配,并输出相应的结果。