Java多线程等待与唤醒
wait notify
java一道多线程题,子线程循环10次,主线程接着循环100次,如此循环50次的问题
package com.rumenz.test;
public class Thread4{
public static void main(String[] args) {
Bus b=new Bus();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 50; i++) {
b.Sub(i);
}
}
}).start();
for (int i = 0; i < 50; i++) {
b.main(i);
}
}
}
class Bus{
private boolean isSub=true;
public synchronized void Sub(int n) {
while(!isSub) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for (int i = 0; i < 50; i++) {
System.err.println("sub"+i+"--"+n);
}
isSub=false;
this.notify();
}
public synchronized void main(int n) {
while(isSub) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for (int i = 0; i < 100; i++) {
System.err.println("main"+i+"+++"+n);
}
isSub=true;
this.notify();
}
}
Condition方案
package com.rumenz.test;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Thread9{
public static void main(String[] args) {
Bu b=new Bu();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 50; i++) {
b.sub(i);
}
}
}).start();
for (int i = 0; i < 50; i++) {
b.main(i);
}
}
static class Bu{
Lock l=new ReentrantLock();
Condition con=l.newCondition();
private Boolean flag=false;
public void sub(int i) {
l.lock();
try {
while(!flag) {
try {
con.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for (int j = 0; j < 10; j++) {
System.err.println("sub---"+j+"i");
}
flag=false;
con.signal();
}finally {
l.unlock();
}
}
public void main(int i) {
l.lock();
try {
while(flag) {
try {
con.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for (int j = 0; j < 100; j++) {
System.err.println("main---"+j+i);
}
flag=true;
con.signal();
} finally {
// TODO: handle finally clause
l.unlock();
}
}
}
}