我想在所有三个线程完成后执行方法uploadingDone().
这些标志在大多数情况下都是正确的.在极少数情况下,所有三个设置为true的标志和BLOCK1将执行两次.这三个线程对不同的数据执行不同的任务(不能进行并发修改).
我可以使用线程上的任何本机函数消除这些标志吗?
所有三个线程都将并行运行(强制要求).
BLOCK1应该仅被调用一次.
private synchronized void uploadingDone(){
if( isItemUploaded && isListUploaded && isStoreUploaded){
uploadingDone = true;
//
//TODO move to next screen
}else{
Log.i(TAG, "uploadingDone: Failed");
}
}
private boolean isListUploaded = false, isItemUploaded = false, isStoreUploaded = false, uploadingDone = false;
private class ListUpload extends Thread{
@Override
public void run() {
isListUploaded = true;
Log.i(TAG, "ListUpload Thread started");
if(!uploadingDone)
uploadingDone();
}
}
private class ItemUpload extends Thread{
@Override
public void run() {
Log.i(TAG, "ItemUpload Thread started");
isItemUploaded = true;
if(!uploadingDone)
uploadingDone();
}
}
private class StoreUpload extends Thread{
@Override
public void run() {
Log.i(TAG, "StoreUpload Thread started");
isStoreUploaded = true;
if(!uploadingDone)
uploadingDone();
}
}
private ListUpload listUpload;
private StoreUpload storeUpload;
private ItemUpload itemUpload;
public void startUpload(){
listUpload = new ListUpload();
listUpload.start();
storeUpload = new StoreUpload();
storeUpload.start();
itemUpload = new ItemUpload();
itemUpload.start();
}
谢谢.
解决方法:
跳过标志并添加
listUpload.join();
storeUpload.join();
itemUpload.join();
//
在startUpload()的末尾.每次对join()的调用都会导致调用线程阻塞,直到给定线程完成.
标签:multithreading,thread-safety,java,android
来源: https://codeday.me/bug/20191101/1985048.html