问题:java中两个线程交替执行,一个输出奇数,一个输出偶数
方法一:
看到题目时,我第一个想到的是用synchronized加锁,然后使用notify唤醒线程和wait阻塞线程
通过 synchronized 锁定对象,每次只能有一个线程进入,每打印一个数,就释放锁,另一个线程进入,拿到锁,打印,唤醒另一个线程,然后挂起自己。循环反复,实现了一个最基本的打印功能。
public class Text1 {
private static int state=1;
public static void main(String[] args) {
final Text1 text1=new Text1();
new Thread(new Runnable() {
public void run() {
synchronized (text1) {
while(state!=1){
//当state!=1是,说明不该线程1打印,则将线程1挂起,让线程2执行打印
try {
text1.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for(int i=1;i<=100;i=i+2){
System.out.println(i);//当线程1打印之后,该线程2打印了,此时将状态state置为2
state=2; //唤醒线程2,并使用wait交出锁资源,线程2执行打印
try {
text1.notify();
text1.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//text1.notify();
}
}
}).start();
new Thread(new Runnable() {
public void run() {
synchronized (text1) {
while(state!=2){
//当state!=2,说明不该线程2执行,则将线程2挂起,让线程1执行打印
try {
text1.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for(int i=2;i<=100;i=i+2){
System.out.println(i);//线程2打印完成之后将state置为1,将线程1唤醒,并使用wait交出锁
state=1;
try {
text1.notify();
text1.wait(