两个线程交替打印,就是要两个线程之间进行同步,走走停停。线程的同步可以使用Object类自带的wait和notify(或者notifyAll)方法实现。
synchronized(lock)
//通知其他线程运行
lock.notify();
//先等待
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
Condition接口也提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
// thread 1
lock.lock();
condition.await();
doSomething();
lock.unlock();
// thread 2
lock.lock();
doSomething();
condition.signal();
lock.unlock();
void signal():唤醒一个等待在condition上的线程,将该线程从等待队列中转移到同步队列中,如果在同步队列中能够竞争到Lock则可以从等待方法中返回。
Condition能够支持不响应中断,而通过使用Object方式不支持;
Condition能够支持多个等待队列(new 多个Condition对象),而Object方式只能支持一个;
Condition能够支持超时时间的设置,而Object不支持
斐波那契数列,青蛙跳格
public static int JumpFloor(int target) {
if(target == 1){
return 1;
}
if(target == 2){
return 2;
}
//第一次有两种选择,然后根据不同的选择,然后开始不同的下一步,但是下一步还是一样有两种选择
return JumpFloor(target - 1) + JumpFloor(target - 2);
}
下面是方法二,主要还是有规律,实际这样的写法没意义
public int JumpFloor2(int target) {
int x=1, y=2, z;
if(target == 1){
return 1;
}
if(target == 2){
return 2;
}
for(int i = 3; i <= target; i ++){
z = y;
y = x + y;
x = z;
}
return y;
}