Java线程同步Condition替代wait-notify
package zhangphil.demo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class MainActivity extends AppCompatActivity {
private boolean flag = false;
private Lock mLock = new ReentrantLock();
private Condition mCondition = mLock.newCondition();
//等待,加锁。
private void await() throws Exception {
mLock.lock();
try {
mCondition.await();
} finally {
mLock.unlock();
}
}
//发送信号,解锁。
private void signal() {
mLock.lock();
try {
mCondition.signalAll();//或者 mCondition.signal();
} finally {
mLock.unlock();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.change_flag).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
flag = !flag;
System.out.println(flag + "");
}
});
findViewById(R.id.notify_all).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
notify_all();
}
});
t();
}
private void t() {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println(Thread.currentThread().getId() + "-" + System.currentTimeMillis());
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (flag) {
try {
await();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}).start();
}
private void notify_all() {
signal();
}
}