目录
题目介绍
方法一
方法二
方式三
方式四
题目介绍
class FooBar {
public void foo() {
for (int i = 0; i < n; i++) {
print("foo");
}
}
public void bar() {
for (int i = 0; i < n; i++) {
print("bar");
}
}
}
方法一
利用yield。
public class ClassForTestFoobar {
private int n;
public ClassForTestFoobar(int n){
this.n = n;
}
private volatile boolean flag = false;
public void foo(Runnable printFoo){
for (int i = 0; i < n; i++){
while(flag){
Thread.yield();
}
printFoo.run();
flag = true;
}
}
public void bar(Runnable printBar){
for (int i = 0; i < n; i++){
while(!flag){
Thread.yield();
}
printBar.run();
flag = false;
}
}
public static void main(String[] args) {
ClassForTestFoobar classForTestFoobar = new ClassForTestFoobar(3);
Thread thread1 = new Thread(){
@Override
public void run() {
classForTestFoobar.foo(
new Runnable() {
@Override
public void run() {
System.out.print("foo");
}
}
);
}
};
Thread thread2 = new Thread(){
@Override
public void run() {
classForTestFoobar.bar(
new Runnable() {
@Override
public void run() {
System.out.print("bar");
}
}
);
}
};
thread2.start();
thread1.start();
}
}
方法二
利用reentrantlock。
public class ClassForTestFoobar {
private int n;
public ClassForTestFoobar(int n){
this.n = n;
}
private volatile boolean flag = false;
private ReentrantLock reentrantLock = new ReentrantLock();
private Condition condition1 = reentrantLock.newCondition();
private Condition condition2 = reentrantLock.newCondition();
public void foo(Runnable printFoo) throws InterruptedException {
reentrantLock.lock();
for(int i=0;i
方式三
利用wait和notify。
public class ClassForTestFoobar {
private int n;
public ClassForTestFoobar(int n){
this.n = n;
}
private volatile boolean flag = false;
private Object object = new Object();
public void foo(Runnable printFoo) throws InterruptedException {
for(int i=0;i
方式四
利用semaphore。
public class ClassForTestFoobar {
private int n;
public ClassForTestFoobar(int n){
this.n = n;
}
Semaphore semaphore1 = new Semaphore(1);
Semaphore semaphore2 = new Semaphore(0);
public void foo(Runnable printFoo) throws InterruptedException {
for(int i=0;i



