1、里面用while好于用if
2、synchronize和wait以及notify ,notifyAll一起使用,首先判断是否是该线程,如果不是就wait(),如果是该线程就执行线程内容,再notifyAll ,notifyAll也可以放在最前面。
3、flag判断方式,两个线程的判断,一正一副,三个或以上的用 三个判断符号用||来判断
public class threadPrint {
public static void main(String[] args) {
Object obj = new Object();
new Thread(new MyThread2(obj,1), "线程"+1).start();
new Thread(new MyThread2(obj,3), "线程"+3).start();
new Thread(new MyThread2(obj,2), "线程"+2).start();
}
}
class MyThread2 implements Runnable{
private static int i = 0;//打印的值 1-75
private static int count=0;//计数 三次一轮回
private Object obj;
private int n;//接参 i值
public MyThread2(Object obj,int n) {
this.obj=obj;
this.n = n;
}
@Override
public void run() {
synchronized (obj) {
while(i<75){//i++ 在代码块 所以到74就可以了
obj.notifyAll();//唤醒所有线程
while(count%3!=(n-1)){ //找出下一个线程 不正确的线程等待
try {
obj.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/*try {
obj.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
}
i++;
System.out.println(Thread.currentThread().getName()+": "+i);
if(i%5 == 0){ //打印了五次后 此线程让出资源,等待
try {
count++; //count是static修饰 ,为了共享
System.out.println();
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}