2

我是 android 编程新手。对不起,如果以前有人问过这类问题。创建线程时遇到问题。在我的代码中,我已经初始化int i=500;,在我的第一个线程 t1 中,我想增加 t1 的值,if(i<5000)并且在我的线程 t2 上想检查 t2 的值减少的条件if(i>0) 请帮助...提前致谢

4

2 回答 2

7

这是针对此特定增量/减量问题所需的 android 的普通 java Thread 实现...

// 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 而不是纯 int 以避免并发访问问题。

于 2013-10-30T05:50:45.220 回答
2

您可以通过使用 AsyncTask 来做到这一点:http: //developer.android.com/reference/android/os/AsyncTask.html

请注意,在 Android 的某些版本中,AsyncTask 在单个线程上执行。如果您需要并行执行,则需要在任务上设置,来自文档:

首次引入时,AsyncTask 在单个后台线程上串行执行。从 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。

于 2013-10-30T05:37:26.983 回答