两个不同的线程将会共用一个 FooBar 实例。其中一个线程将会调用 foo() 方法,另一个线程将会调用 bar() 方法。
请设计修改程序,以确保 "foobar" 被输出 n 次。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/print-foobar-alternately
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这是要在线程间进行通信,可使用Lock里的Condition实现,代码如下:
public class OrderThread_Condition{
boolean flag = true;
ReentrantLock lock = new ReentrantLock();
Condition c1 = lock.newCondition();
Condition c2 = lock.newCondition();
public Runnable foo(){
return new Runnable() {
@Override
public void run() {
lock.lock();
try {
for(int i=0;i<5;i++){
if(!flag){
c1.await();
}
flag = false;
System.out.println("foo");
c2.signal();
}
}catch (InterruptedException e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
};
}
public Runnable bar(){
return new Runnable() {
@Override
public void run() {
lock.lock();
try {
for(int i=0;i<5;i++){
if(flag){
c2.await();
}
flag = true;
System.out.println("bar");
c1.signal();
}
}catch (InterruptedException e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
};
}
public static void main(String[] args) {
OrderThread_Condition condition = new OrderThread_Condition();
new Thread(condition.foo()).start();
new Thread(condition.bar()).start();
}
}
接着简单提一些基本知识点:
synchronized释放锁的三种情形:
1,线程执行完被synchronized修饰的代码块
2,线程执行发生异常
3,调用wait()方法
而lock需要手动释放,所以释放锁得放在finally里
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。