gpt4 book ai didi

java - ScheduledExecuterService.scheduleAtFixedRate 创建多个线程池 - Android

转载 作者:太空宇宙 更新时间:2023-11-03 10:49:39 30 4
gpt4 key购买 nike

我的 Android 应用程序中有一个名为 UploadManagerAsyncTask,它检查已处理的项目,并将它们上传到服务器。
为此,我使用 ScheduledExecutorService.scheduleAtFixedRate 每 1 分钟检查一次项目,并将它们上传到服务器。
然而,有时会创建多个线程池(这种情况发生的概率为 10%),因此有时会向服务器发送两次相同的请求,尽管这种并发性是在服务器和客户端级别处理的,但我仍然不希望这种情况发生在客户端。
下面是代码的样子。
在 MainActivity(启动 Activity )中,我将 UploadManager 启动为:

public class MainActivity extends BaseActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
.
.
.
new UploadManager().execute(this);
}
}

UploadManager 的工作方式如下:

public class UploadManager extends AsyncTask<Context, Integer, Integer> {

private ScheduledExecutorService scheduledExecutorService;
private static final int NUM_OF_THREADS = 5;
private static final int DELAY_IN_SECONDS = 60;
private Context context;
private final Logger logger = new Logger(getClass().getSimpleName());

protected Integer doInBackground(Context... context) {
this.context = context[0];
scheduledExecutorService = Executors.newScheduledThreadPool(NUM_OF_THREADS);
scheduledExecutorService.scheduleAtFixedRate(postInformation, 5, DELAY_IN_SECONDS, TimeUnit.SECONDS);
return 0;
}

private Runnable postInformation = new Runnable() {
@Override
public void run() {
if (NetworkManager.isInternetAvailable(context)) {
uploadAcknowledgement();
}
}
};

private void uploadAcknowledgement() {
List<Acknowledgement> ackList = null;
try {
logger.info("RUNNING TASK TO POST ACKNOWLEDGEMENT");
.
.
}
}
}

当我检查日志时,它说:

35119 [pool-2-thread-1] INFO  Upload Manager - [1363841355530] : 21/03/2013 10:19:15 : RUNNING TASK TO POST ACKNOWLEDGEMENT  
35122 [pool-3-thread-1] INFO Upload Manager - [1363841355532] : 21/03/2013 10:19:15 : RUNNING TASK TO POST ACKNOWLEDGEMENT

这清楚地表明现在有多个线程池,因此多次调用了uploadAcknowledgement()方法。

MainActivity 在 AndroidManifest.xml 中声明为:

<application android:label="@string/app_name" android:icon="@drawable/icon">
<activity android:name="MainActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</activity>
.
.

最佳答案

我最终找到了原因,如果 ScheduledExecutor 的服务重叠运行,那么它会产生新的工作线程(例如,在这种情况下 postInformation() 创建一个新的工作线程),最后是一个新的池。
但是,可以通过使用 newSingleThreadScheduledExecutor 来避免多个 worker 。而不是 newScheduledThreadPool(int corePoolSize)'
因此,不要将 `scheduledExecutorService' 初始化为:

scheduledExecutorService = Executors.newScheduledThreadPool(NUM_OF_THREADS);  

它应该被初始化为:

scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();  

这样可以确保没有多个工作线程在运行。

关于java - ScheduledExecuterService.scheduleAtFixedRate 创建多个线程池 - Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15826661/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com