- /* 有三个线程,线程1输出为:1、2、3、4、5;线程2输出为:a、b、c、d、e;线程3输出为:张、王、李、赵、刘;要求三个线程同步输出,
使得最终输出结果为:1、a、张、2、b、王、3、c、李……
【提示】布尔型只有两个值,只能控制两个线程,因此对象的状态需要int型数据控制
*/
class Flag{
private int flag=1;
String [] a;
public void get(int current,int next) {
while(flag!=current)
try { wait();} catch(Exception e){;}
flag = next;
notifyAll(); //必须用notifyAll因为有多个线程在等待
}
}
class Print extends Thread{
private Flag f;
String [] a;
int current,next;
Print(Flag x,int y,int z,String[] w){
f = x;
current = y;
next = z;
a = w;
}
public void run() {
synchronized(f){
for(String x:a) {
f.get(current, next);
System.out.print(x+" ");
try {Thread.sleep(100);}catch(Exception e) {;}
}
}
}
}
class app_Print{
public static void main(String [] args) {
String [] s1 = {"1","2","3","4","5"};
String [] s2 = {"a","b","c","d","e"};
String [] s3 = {"张","王","李","赵","刘"};
Flag f = new Flag();
Print p1 = new Print(f,1,2,s1);
Print p2 = new Print(f,2,3,s2);
Print p3 = new Print(f,3,1,s3);
p1.start(); p2.start(); p3.start();
try {p1.join();p2.join();p3.join();}
catch(Exception e) {;}
//三个join表示p1,p2,p3不执行完毕,就无法走到这里
System.out.print("\n线程结束");//希望此语句作为最后一条语句输出
}
}
实现框架:
(1)多个线程通过一个对象进行关联,类比【生产者、消费者】通过【缓冲区】关联;
(2)关联对象提供一个状态标志【类比缓冲区】,由该标志决定是等待还是执行;
(3)各线程基于关联对象进行同步,即run中使用synchronized(D) {S}