首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android -为什么第二个线程会暂停第一个线程的执行?

Android -为什么第二个线程会暂停第一个线程的执行?
EN

Stack Overflow用户
提问于 2011-12-16 00:59:14
回答 2查看 238关注 0票数 0

我有一个在循环中运行两个线程的应用程序。第一个是以1s的间隔更新一个图,第二个是以60s的间隔更新另一个图。第二个任务需要很长的时间,因为它需要查询互联网中的某个服务器3次,而这可能并不总是可用的,即使它是可用的,也将需要5-7秒来执行。

正在发生的事情是,当我启动第二个线程时,它会暂停第一个线程的执行,这不是我想要的,我希望这两个线程同时运行。在Youtube视频中,你可以看到应用程序运行的结果。http://youtu.be/l7K5zSWzlxI "thread_updater1s“正在运行绿色图形、大读数和角落中的计时器,因此您可以清楚地看到它停止了11秒。

1)首先,为什么会发生这种情况?如何修复它?

2)我意识到我可能根本不能正确启动线程。我很难理解如何让一些东西在Java的区间循环中运行,而我的代码对于一个图形/踏步来说工作得很好。现在,当我在单独的线程中有两个循环时,我不知道为什么它们不能同时执行。

代码如下:

代码语言:javascript
复制
public class LoopExampleActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.main);
    thread_updater1s.start();
    thread_updater2.start();
}// end of onCreate

final Runnable r1s = new Runnable() {
    public void run() {
        do_1s_updates(); // those are very quick http calls to the local API server 
    }                    // to get data nessessary for some plot.
                        // They have 1s timeout as well but rarely timeout
};

final Runnable r2 = new Runnable() {
    public void run() {
        do_large_updates(); //This makes 7 long call over the Internet to the slow https
                            //server once every 60s. Has 10s timeout and sometimes takes as much as
                            //7s to execute
        }
};

Thread thread_updater1s = new Thread() {
    @Override
    public void run() {
        try {
            while (true) {
                handler.post(r1s);
                sleep(1000);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};

Thread thread_updater2 = new Thread() {
    @Override
    public void run() {
        try {
            while (true) {
                handler2.post(r2);
                sleep(60000);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};

}

PS。请原谅和提供信息,我只编写了15天的Java代码,到目前为止,完全没有经验或教训。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-16 16:43:04

您需要在线程中发出http请求(而不是发布的runnables)。然后,下载数据后,使用该数据创建一个runnable,该runnable将更新图形并post该runnable,以便由UI线程执行。下面是一个示例:

代码语言:javascript
复制
public class LoopExampleActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.main);
    thread_updater1s.start();
    thread_updater2.start();
}// end of onCreate

Thread thread_updater1s = new Thread() {
    @Override
    public void run() {
        try {
            while (true) {
                final Object data = getDataFromServer1();
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        updateGraph1(data);
                    }
                );
                sleep(1000);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};

Thread thread_updater2 = new Thread() {
    @Override
    public void run() {
        try {
            while (true) {
                final Object data = getDataFromServer2();
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        updateGraph2(data);
                    }
                );
                sleep(60000);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};

显然,通过表示下载的数据的适当类来更改最终的对象数据。

票数 0
EN

Stack Overflow用户

发布于 2011-12-16 04:10:14

handler.post将runnable推送到主线程的消息队列上,以便在主线程上执行。

所以你所做的就是在每一个睡眠间隔,你会向主线程发送一条消息来运行这个函数。显然,主线程不能同时运行两件事,所以这就是为什么一个runnable被推迟到下一个。

您可能希望在单独的线程中执行runnable的工作--为什么要开始使用处理程序?如果直接调用do_1s_updatesdo_large_updates而不是通过处理程序& runnable会发生什么?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8523784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档