这是一个一般的Java问题,而不是一个Android一个第一关!
我想知道如何在主线程上运行代码,从辅助线程的上下文。 例如:
new Thread(new Runnable() {
public void run() {
//work out pi to 1,000 DP (takes a while!)
//print the result on the main thread
}
}).start();
诸如此类的事情 - 我知道我的例子是有点差,因为在Java中,你不需要在主线程中打印出来的东西,那摇摆具有事件队列也 - 但一般情况下,你可能需要运行说一个Runnable在主线程,同时在后台线程的上下文。
编辑:对于比较 - 这里就是我会做它用Objective-C:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0UL), ^{
//do background thread stuff
dispatch_async(dispatch_get_main_queue(), ^{
//update UI
});
});
提前致谢!
还有就是刚才送一些代码到另一个正在运行的线程,并说没有通用的方法:“嘿,你做到这一点。” 您将需要把主线程进入它具有一个用于接收工作,并正在等待工作要做的机制的状态。
下面是设置主线程等待其他线程的接收工作,并运行它,因为它到达一个简单的例子。 很明显,你会想添加的方式其实就是结束程序等等...!
public static final BlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>();
public static void main(String[] args) throws Exception {
new Thread(new Runnable(){
@Override
public void run() {
final int result;
result = 2+3;
queue.add(new Runnable(){
@Override
public void run() {
System.out.println(result);
}
});
}
}).start();
while(true) {
queue.take().run();
}
}
如果你是在Android上,通过处理器应该做的工作?
new Handler(Looper.getMainLooper()).post(new Runnable () {
@Override
public void run () {
...
}
});
一个古老的讨论,但如果是发送请求到主线程(一个不是相反方向)的事你也可以用期货做。 其基本目标是在后台执行的东西,当它完成后,得到的结果:
public static void main(String[] args) throws InterruptedException, ExecutionException {
// create the task to execute
System.out.println("Main: Run thread");
FutureTask<Integer> task = new FutureTask<Integer>(
new Callable<Integer>() {
@Override
public Integer call() throws Exception {
// indicate the beginning of the thread
System.out.println("Thread: Start");
// decide a timeout between 1 and 5s
int timeout = 1000 + new Random().nextInt(4000);
// wait the timeout
Thread.sleep(timeout);
// indicate the end of the thread
System.out.println("Thread: Stop after " + timeout + "ms");
// return the result of the background execution
return timeout;
}
});
new Thread(task).start();
// here the thread is running in background
// during this time we do something else
System.out.println("Main: Start to work on other things...");
Thread.sleep(2000);
System.out.println("Main: I have done plenty of stuff, but now I need the result of my function!");
// wait for the thread to finish if necessary and retrieve the result.
Integer result = task.get();
// now we can go ahead and use the result
System.out.println("Main: Thread has returned " + result);
// you can also check task.isDone() before to call task.get() to know
// if it is finished and do somethings else if it is not the case.
}
如果你的目的是做几件东西在后台和检索的结果,你可以在上面说,设置一些队列,也可以在几个期货(在需要时甚至从另一个未来开始一次全部或者开始一个新的,)分裂过程。 如果您存储在地图或列表,在主线程中初始化每一个任务,你可以检查您要随时期货和他们这样做时,你得到他们的结果。
您可能需要使用“甚至分派线程”,其中大多数事件驱动的事情发生。 如果您使用的摆动,则:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Your code here.
}
});
或者创建一个实现Runnable类,并将其传递到了invokeLater()。
如果你使用JavaFX的,我强烈建议,那么你可以使用
Platform.runLater(new Runnable() {
@Override
public void run() {
alert(text);
}
});
从非UI线程内,并且从UI线程从你的线程返回执行的Runnable。