这道题考的是JAVA多线程同步通信和一丢丢JAVA逻辑,做完感觉受益颇多记录一下。本人JAVA新手,如有错误,可优化的地方欢迎指出。排版,格式问题等请多包涵。
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class textthread extends Thread{
private static int flag = 1;
private static ReentrantLock lock = new ReentrantLock();
private static final Condition condition1 = lock.newCondition();
private static final Condition condition2 = lock.newCondition();
private static final Condition condition3 = lock.newCondition();
private static final int[] a = {1,2,3,4,5};
private static final int[] b = {6,7,8,9,10};
private static final int[] c = {11,12,13,14,15};
private static final int bigtimes = 5;
private static int times=0;
public static void main(String[] args) {
Thread thread1 =new Thread("线程1"){
int mintimes1 = -10;
@Override
public void run(){
do{
try {
lock.lock();
while(flag!=1){
condition1.await();
}
mintimes1 = mintimes1+10;
for(int i = 0; i < bigtimes; i++){
System.out.println(Thread.currentThread().getName()+":");
System.out.println(a[i]+mintimes1);
//System.out.println(Thread.currentThread().getName()+":"+a[i]+mintimes1);
//如果这么写会产生输出歧义
}
flag = 2;
condition2.signalAll();
} catch (Exception e) {
// TODO: handle exception
}finally{
lock.unlock();
times++;
}
}while(times<10);
}
};
Thread thread2 =new Thread("线程2"){
int mintimes2 = -10;
@Override
public void run(){
do{
try {
lock.lock();
while(flag!=2){
condition2.await();
}
mintimes2 = mintimes2 +10;
for (int i = 0; i < bigtimes; i++) {
System.out.println(Thread.currentThread().getName()+":");
System.out.println(b[i]+mintimes2);
}
flag = 3;
condition3.signalAll();
} catch (Exception e) {
// TODO: handle exception
}finally{
lock.unlock();
times++;
}
}while(times<10);
}
};
Thread thread3 =new Thread("线程3"){
int mintimes3 = -10;
@Override
public void run() {
do{
try {
lock.lock();
while(flag!=3){
condition3.await();
}
mintimes3 = mintimes3 +10;
for (int i = 0; i < bigtimes; i++) {
System.out.println(Thread.currentThread().getName()+":");
System.out.println(c[i]+mintimes3);
}
flag = 1;
condition1.signalAll();
} catch (Exception e) {
// TODO: handle exception
}finally{
lock.unlock();
times++;
}
}while(times<10);
}
};
thread1.start();
thread2.start();
thread3.start();
}//main
}