今天复习java线程知识方面的时候遇到一个题,随手记录下
题目要求:
1、创建2个Thread
2、一个线程负责输入字符串
另一个线程负责输出字符串到控制台
3、线程同步
读线程读一个字符串变量之后,写线程才输出该字符串变量
4、通过循环机制实现读线程和写线程交替运行,实现字符串的读入和输出。
当执行5次输入输出后退出或输入Q字符串后退出循环
这道题比较类似于生产者消费者问题,如果对生产者消费者问题比较熟悉的话,这道题还是挺简单的
所以这道题我是使用同步锁synchronized来解决的
threadA负责输入字符串:
import java.util.Scanner;
public class ThreadA implements Runnable {
Demo demo = new Demo();
public ThreadA(Demo demo) {
this.demo = demo;
}
@Override
public void run() {
synchronized (demo) {
for (int i = 0; i < 5; i++) {
if (!Demo.flag) {
try {
demo.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "请输入一个字符串(Q键退出):");
Demo.str = new Scanner(System.in).next();
Demo.flag = false;
if (Demo.str.equalsIgnoreCase("Q")) {
System.out.println("正在退出程序...");
System.exit(0);
}
demo.notify();
}
}
}
}
threadB类负责在控制台输出字符串:
public class ThreadB implements Runnable {
Demo demo = new Demo();
public ThreadB(Demo demo) {
this.demo = demo;
}
@Override
public void run() {
synchronized (demo) {
for (int i = 0; i < 5; i++) {
if (Demo.flag) {
try {
demo.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "输出获取的字符串为:" + Demo.str);
Demo.flag = true;
demo.notify();
}
}
}
}
主类Demo:
public class Demo {
public static boolean flag=true;
public static String str;
public static void main(String[] args) {
Demo demo=new Demo();
Thread ta=new Thread(new ThreadA(demo));
Thread tb=new Thread(new ThreadB(demo));
ta.setName("ta");
tb.setName("tb");
ta.start();
tb.start();
}
}
以下是我使用匿名内部类以及lambda表达式的简化代码:
public class Test {
private static boolean flag = true;
private static String str;
private static Object obj = new Object();
public static void main(String[] args) {
new Thread(() -> {
synchronized (obj) {
for (int i = 0; i < 5; i++) {
if (!flag) {
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "请输入一个字符串(Q键退出):");
str = new Scanner(System.in).next();
flag = false;
if (str.equalsIgnoreCase("Q")) {
System.out.println("正在退出程序...");
System.exit(0);
}
obj.notify();
}
}
}, "ta").start();
new Thread(() -> {
synchronized (obj) {
for (int i = 0; i < 5; i++) {
if (flag) {
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "输出获取的字符串为:" + str);
flag = true;
obj.notify();
}
}
}, "tb").start();
}
}
大家有什么更高效跟简洁的代码可以交流交流