我正在使用Android进行开发,但这个问题在任何其他Java平台上都可能同样有用。
我开发了一个多线程应用程序。假设我有一个需要执行时间密集型任务的第一类,因此这项工作在另一个Thread中完成。 完成后,相同的Thread会将时间密集型任务结果返回给另一个(第3个)类。
这最后一节课会做一些事情并将结果返回给第一个起始课。 我注意到虽然第一堂课将一直等待,也许是因为这是某种循环?
此外,我希望Thread-class能够自行停止,就像它将结果传递给第三类一样,它应该停止。第三类必须在没有被“封装”在第二类(线程一)的情况下完成它的工作。 谁知道如何做到这一点?
现在的经验是,第一个似乎在等待(挂起),直到第二个和第三个完成:(
答案 0 :(得分:11)
如果你想使用线程而不是AsyncTask
,你可以这样做:
private static final int STEP_ONE_COMPLETE = 0;
private static final int STEP_TWO_COMPLETE = 1;
...
private doBackgroundUpdate1(){
Thread backgroundThread = new Thread() {
@Override
public void run() {
// do first step
// finished first step
Message msg = Message.obtain();
msg.what = STEP_ONE_COMPLETE;
handler.sendMessage(msg);
}
}
backgroundThread.start();
}
private doBackgroundUpdate2(){
Thread backgroundThread = new Thread() {
@Override
public void run() {
// do second step
// finished second step
Message msg = Message.obtain();
msg.what = STEP_TWO_COMPLETE;
handler.sendMessage(msg);
}
}
backgroundThread.start();
}
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch(msg.what){
case STEP_ONE_COMPLETE:
doBackgroundUpdate2();
break;
case STEP_TWO_COMPLETE:
// do final steps;
break;
}
}
}
您可以致电doBackgroundUpdate1()
将其打开,完成后会向handler
发送消息,然后启动doBackgroundUpdate2()
等。
答案 1 :(得分:2)
老虎,
TiGer写道:
完成相同的线程后 返回耗时的任务结果 到另一个(第三)课
由于线程异步运行,因此您的非线程类无法与您的线程同步 虽然要对活动执行某些操作,但您需要AsyncTask而非A线程
TiGer写道:
也许是因为这是某种形式 循环?
Tiger会详细了解Threads和concurrency
所以我现在唯一的答案是 ASYNCTASK
编辑:
我还想让Thread-class停下来 本身
答案 2 :(得分:0)
在普通的Java中,你会这样做:
class MyTask implements Runnable {
void run() {
for (int i = 0; i < Integer.MAX; i++) {
if (i = Integer.MAX -1) {
System.out.println("done");
}
}
}
}
class MyMain {
public static void main(String[] argv) {
for (int i = 0; i < 10; i++) {
Thread t = new Thread(new MyTask());
t.start();
}
System.out.println("bye");
}
}
......开始了10个主题。请注意,如果您不小心调用了t.run()而不是t.start(),那么您的runnable将在主线程中执行。可能你会在10'完成'之前看到'再见'。请注意,当您给它们的Runnable的run()方法完成时,线程“停止”。
我希望这能帮助你了解你必须协调的事情。
兼并的棘手部分是让线程相互通信或共享对象的访问权。
我相信Android以Handler
的形式为此提供了一些机制,designing for responsiveness下的开发者指南中对此进行了描述。
关于Java并发主题的优秀书籍是Java Concurency in Practice。
答案 3 :(得分:0)
如果你想使用$string = 'gardens, countryside'
$username ='@teddy135'
而不是线程在android中
我已经使用Android中的AsyncTask
和Handler解决了这个问题,目的是在编译一个任务后执行一个任务。听到的是在编译该进程后显示第一个加载动画的代码,它将进入另一个页面
ASyncTask