synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:
修饰对象 | 别名 | 作用的范围 | 作用的对象 |
---|---|---|---|
代码块 | 同步语句块 | 大括号{}括起来的代码 | 调用这个代码块的对象 |
方法 | 同步方法 | 整个方法 | 调用这个方法的对象 |
静态的方法 | none | 整个静态方法 | 这个类的所有对象 |
类 | none | synchronized后面括号括起来的部分 | 这个类的所有对象 |
本小节 基于 修饰方法,提供实例代码。后续同步操作可复用此模板:
-1- 构造一个回调函数
public abstract class ResponseListener<T> {
public void onSuccess(T t){}
public void onFailure(String msg){}
public void onProgress(int status){}
}
-2- 构造一个类,实现线程操作
public class SmartKit {
public SmartKit() {}
public void run(final ResponseListener<String> listener ){
new Thread(new Runnable() {
@Override
public void run() {
try {
for (int i=0 ; i<5 ; i++){
Thread.sleep(1000);
listener.onProgress(i);
}
listener.onSuccess("onSuccess.");
}catch (InterruptedException e){
e.printStackTrace();
listener.onFailure("onFailure.");
}
}
}).start();
}
}
-3- UserService类, 其中用到了 synchronized同步了方法块
public class UserService {
SmartKit mSmartKit;
boolean mIsLogin;
public UserService() {
mSmartKit = new SmartKit();
mIsLogin = false;
}
public synchronized boolean run(){
Log.i("xf","线程开始");
mSmartKit.run(new ResponseListener<String>() {
@Override
public void onSuccess(String s) {
super.onSuccess(s);
Log.i("xf","onSuccess: "+s);
mIsLogin = true;
synchronized (UserService.this){
UserService.this.notifyAll();
}
}
@Override
public void onFailure(String msg) {
super.onFailure(msg);
Log.i("xf","onFailure: "+msg );
synchronized (UserService.this){
UserService.this.notifyAll();
}
}
@Override
public void onProgress(int status) {
super.onProgress(status);
Log.i("xf","onProgress: "+status);
}
});
Log.i("xf","线程已开始,等待过程");
synchronized (this){
try {
Log.i("xf","线程执行中,等待结果通知");
wait();
}catch (InterruptedException e){
e.printStackTrace();
}
}
Log.i("xf","线程执行结束,得到通知: "+mIsLogin);
return true;
}
}
-4- 用一个按钮,执行 UserService.run()
public class MainActivity extends AppCompatActivity {
UserService mUserService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mUserService = new UserService();
Button btnTest = (Button) findViewById(R.id.button);
btnTest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mUserService.run();
}
});
}
-5- 根据以下log的显示,结合上面代码,大概可以知道整个函数的行驶流程。
<关键看看UserService类中的 run()方法>
I/xf: 线程开始
I/xf: 线程已开始,等待过程
I/xf: 线程执行中,等待结果通知
I/xf: onProgress: 0
I/xf: onProgress: 1
I/xf: onProgress: 2
I/xf: onProgress: 3
I/xf: onProgress: 4
I/xf: onSuccess: onSuccess.
I/xf: 线程执行结束,得到通知: true