我是android编程的新手。如果之前已经问过这类问题。
我在创建线程时遇到麻烦。在我的代码中,我初始化了int i=500;
并且在我的第一个线程t1中,我想增加t1 if(i<5000)
的值,并且在我的线程t2上想要检查t2的值递减的条件if(i>0)
请帮忙...提前致谢
答案 0 :(得分:6)
以下是针对此特定增量/减量问题所需的android的简单java线程实现...
// class lass level declarations
private static int DEF_VALUE = 500;
private static int MIN_VALUE = 0;
private static int MAX_VALUE = 1000;
private AtomicInteger i = new AtomicInteger(DEF_VALUE);
private Thread t1 = null;
private Thread t2 = null;
private void initThreads() {
Log.i(TAG, "Initializing Threads...");
t1 = new Thread(new Runnable() {
@Override
public void run() {
Log.i(TAG, "Starting T1.");
while (i.get() < MAX_VALUE) {
i.incrementAndGet();
Log.d(TAG, String.format("Incremented by T1, i = %d", i.get()));
}
Log.i(TAG, "Finishing T1.");
}
});
t2 = new Thread(new Runnable() {
@Override
public void run() {
Log.i(TAG, "Starting T1.");
while (i.get() > MIN_VALUE) {
i.decrementAndGet();
Log.d(TAG, String.format("Decremented by T2, i = %d", i.get()));
}
Log.i(TAG, "Finishing T2.");
}
});
t1.start();
t2.start();
}
希望这有助于......:)
更新:更新源以使用AtomicInteger而不是plain int来避免并发访问问题。
答案 1 :(得分:2)
您可以使用AsyncTask执行此操作:http://developer.android.com/reference/android/os/AsyncTask.html
请注意,在Android上的某些版本中,AsyncTask在单个线程上执行。如果你需要在paralell中执行,则需要在文档中设置任务:
首次引入时,AsyncTasks在单个后台线程上串行执行。从DONUT开始,这被改为一个线程池,允许多个任务并行运行。从HONEYCOMB开始,任务在单个线程上执行,以避免由并行执行引起的常见应用程序错误。 如果您真的想要并行执行,可以使用THREAD_POOL_EXECUTOR调用executeOnExecutor(java.util.concurrent.Executor,Object [])。
此外,您将遇到并发问题,因此您应该采取措施来处理它们。
可能看起来像这样:
public class DoingTwoThings {
private AsyncTask<Void, Void, Void> taskA;
private AsyncTask<Void, Void, Void> taskB;
private volatile int i;
public DoingTwoThings() {
createTaskA();
createTaskB();
startTasks();
}
private void createTaskA() {
taskA = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... voids) {
doInBackgroundA();
return null;
}
};
}
private void doInBackgroundA() {
while (i < 5000) {
i++;
}
}
private void createTaskB() {
taskB = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... voids) {
doInBackGroundB();
return null;
}
};
}
private void doInBackGroundB() {
while (i > 0) {
i--;
}
}
private void startTasks() {
// AsyncTasks executed one one thread in Honeycomb+ unless executed in thread pool manually
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
taskA.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
taskB.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
taskA.execute();
taskB.execute();
}
}}
覆盖“doInBackground()”方法中的代码在不同的线程上执行。如果您需要在任务完成之前或之后修改某些UI,您可以轻松覆盖onPreExecute和onPostExecute。