题目:
建立m个线程,每个线程只能打印一种字符,要求线程同时运行,交替打印n次字符。
比如: n=3 m=2打印字符为A和B。要求线程1打印3次A,线程2打印3次B,在屏幕输出ABABAB
注意: 需要检查输入有效性,遇到错误输入时,请打印error并安全退出
输入
打印次数n和字符序列。比如:2 ABC(三个字符需要三个打印线程)
样例输入
2 ABC
输出
每个线程打印n次字符,交替打印。在屏幕上输出n次字符序列
样例输出
ABCABC
分析:这里使用lock来进行同步,同时设定state变量来确定该哪个线程执行,因为是动态创建线程,所以首先创建一个类继承Runnable,再用for循环创建多个线程
import java.util.Scanner;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Main {
static int n = 0;
static Lock lock = new ReentrantLock();
static int state = 0;
static Condition condition = lock.newCondition();
static int len = 0;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String[] temp = in.nextLine().split(" ");
if (temp.length != 2) {
System.out.println("err1");
System.exit(0);
}
try {
n = Integer.valueOf(temp[0]);
} catch (NumberFormatException e) {
System.out.println("error");
System.exit(0);
}
if (n <= 0) {
System.out.println("error");
System.exit(0);
}
Lock lock = new ReentrantLock(true);
len = temp[1].length();
char[] ch = temp[1].toCharArray();
for (int i = 0; i < len; i++) {
//初始化当前线程是第几个和要打印的数值
new Thread(new pr(i, ch[i])).start();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
static class pr implements Runnable {
//当前线程打印的是第几个值
int index = 0;
//当前线程打印的字符
char a;
public pr(int index, char a) {
this.index = index;
this.a = a;
}
@Override
public void run() {
// 打印次数
for (int i = 0; i < n; i++) {
lock.lock();
//不该当前线程打印,则休眠
while (index != state) {
try {
condition.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.print(a);
//进入下一个状态
state++;
if (state == len) {
state = 0;
}
//这里必须用SignalAll,否则会造成所有线程都休眠
condition.signalAll();
lock.unlock();
}
}
}
}