最近在做Android的过程中,在UI线程中启动子线程,并通过传参方式执行回调方法,不清楚回调方法的执行线程是谁。猜想是子线程执行回调方法,但是发现GPS服务的onLocationChanged方法执行进程是UI线程(估计是GPS的service是绑定在UI线程上执行造成的),所以特意做了下测试。直接上代码:
public class Test {
public static void main(String[] args) {
System.out.println("111111111");
Thread c = Thread.currentThread();
System.out.println(c.getName() + "=" + c.getId() + "=" + c.hashCode());
System.out.println("111111111");
final Thread thread = new Thread(new Networker(new CallBackListener() {
@Override
public void onCall() {
// TODO Auto-generated method stub
System.out.println("3333333");
Thread c = Thread.currentThread();
System.out.println(c.getName() + "=" + c.getId() + "="
+ c.hashCode());
System.out.println("3333333");
}
}));
Thread thread2 = new Thread() {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
System.out.println("55555");
Thread c = Thread.currentThread();
System.out.println(c.getName() + "=" + c.getId() + "="
+ c.hashCode());
System.out.println("55555");
System.out.println("2222");
thread.start();
System.out.println("2222");
}
};
System.out.println("000000");
thread2.start();
System.out.println("000000");
}
}
class Networker implements Runnable {
CallBackListener listener;
public Networker(CallBackListener listener) {
super();
this.listener = listener;
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("4444");
Thread c = Thread.currentThread();
System.out.println(c.getName() + "=" + c.getId() + "=" + c.hashCode());
System.out.println("4444");
System.out.println("xxxxxxxxxx");
listener.onCall();
System.out.println("xxxxxxxxxx");
}
}
public interface CallBackListener {
public void onCall();
}
再看看执行结果:
证明回调方法是在调用该方法的线程中执行的。
- 大小: 9.3 KB
分享到:
相关推荐
在多线程环境中,每个线程都有自己的执行上下文,这意味着当C++线程回调Java方法时,必须确保Java的同步机制正确地应用,以避免数据竞争和其他并发问题。Java中的`synchronized`关键字和`java.util.concurrent`包下...
本话题将深入探讨如何在Android中使用JNI进行多线程编程,并实现native方法对Java函数的回调。 1. **JNI基础知识**: - JNI是Java平台的一部分,为Java应用程序提供了与本地代码交互的能力。开发者可以通过JNI在...
当我们需要在JNI层创建线程并从这些线程回调Java方法时,就需要对JNI的线程管理和Java方法调用有深入理解。 首先,我们需要了解Java线程和本地线程(即C/C++线程)的区别。Java线程是基于JVM(Java虚拟机)的,而...
在Java编程中,回调方法是一种设计模式,它允许我们在代码执行过程中插入自定义的行为,特别是在异步编程或者事件处理中非常常见。...进一步研究这些文件将有助于加深对Java回调方法的理解和实践。
"如何用Java回调和线程实现异步调用" 在软件开发中,异步调用是一种非阻塞式调用方式,用于在处理比较耗时的任务时保证程序的连续性和实时性。实现异步调用的关键在于解决三个技术难题:程序阻塞问题、异步消息的...
多线程回调Java方法在JNI层实现,能够帮助我们优化程序执行效率,特别是在处理耗时操作如图像处理、音频视频解码等场景。 本文将深入探讨如何在JNI层实现多线程回调Java方法,以及如何解决在C/C++层多线程环境下...
当我们需要在C/C++代码中执行Java方法或者在非Java线程中回调Java方法时,JNI就显得尤为重要。本教程将深入探讨如何在JNI层中创建线程并回调Java方法。 首先,我们需要理解JNI的基本概念。JNI是Java平台标准版的一...
为了实现更灵活的回调,可以在Java中定义一个接口,让C代码通过实现该接口的本地方法来触发Java回调。在C代码中,可以创建一个Java对象并设置其为接口的实现,然后通过Java对象调用接口方法。 5. **线程本地存储...
2. **资源消耗**:回调通常比线程轮询更节省资源,因为它只在有事件时才执行。而轮询则可能一直占用资源。 3. **复杂性**:回调可能导致代码深度嵌套,不易阅读和管理,而线程轮询的代码结构相对简单,但可能需要...
// 在所有线程到达屏障后执行的回调动作 }); // 启动子线程并使用barrier for (int i = 0; i ; i++) { new Thread(() -> { // 执行任务 barrier.await(); }).start(); } ``` ### 方法五:使用`ExecutorService...
当我们谈论“Java接口回调”时,核心思想是:一个类通过实现特定接口,将自身的某个方法暴露给其他对象调用,当特定事件发生或任务完成时,调用这个暴露的方法进行后续处理。 接口回调在Java中的应用广泛,例如在...
在Java中,线程间通信主要通过多种机制实现,其中包括回调(Callback)。回调是一种设计模式,允许一个线程在完成特定任务后通知另一个线程,而无需直接耦合这两个线程。 在上述文档中,回调被用于解决多线程计算...
Java回调机制是编程中一种非常重要的设计模式,它在异步编程、事件驱动编程和通信中扮演着核心角色。在Java中,回调机制允许一个对象(通常被称为回调对象)向另一个对象注册自身的方法,以便在特定事件发生时,被...
线程回调是多线程编程中的一种通信方式,当某个线程执行完毕或者达到特定条件时,它会调用事先约定好的方法,通知另一个线程进行后续处理。这种机制可以用来传递数据、更新UI或者其他必要的操作。 2. **线程回调的...
在Java编程中,回调是一种设计模式,用于在特定事件发生时通知对象或执行代码。这种模式常见于异步编程和事件驱动系统中。回调的概念基于一个简单的思想:当某个操作完成或者达到某个条件时,一个函数(回调函数)会...
这些类提供了回调方法,如`onPreExecute()`(任务开始前),`doInBackground()`(后台执行任务),`onProgressUpdate()`(更新进度),以及`onPostExecute()`(任务完成后)。这样可以确保UI线程不会因耗时操作而被...
当你需要在JNI线程中执行回调时,调用之前创建的本地回调函数,并传入保存的Java方法ID。 4. **使用JNIEnv进行跨线程调用**: 由于JNI环境 (`JNIEnv* env`) 是与线程绑定的,所以不能直接在JNI线程中使用Java方法...
当C代码执行完毕并调用`onCallback`时,Java代码会接收到回调。 以上就是实现C回调Java方法的基本流程。在实际开发中,可能还需要处理多线程同步、异常处理等问题。同时,NDK开发也需要注意内存管理,因为C/C++代码...
在Java编程中,回调是一种设计模式,用于在特定事件发生时通知对象或执行特定操作。回调函数的概念源自函数式编程,但在面向对象编程中也得到了广泛的应用。在Java中,通常通过接口来实现回调机制,这正是“Java简单...
- **多线程编程**:在多线程环境中,线程间通信可以通过回调来实现。 - **框架开发**:许多框架提供扩展点,允许开发者通过回调机制自定义行为。 #### 四、回调与异步的区别 虽然回调通常与异步调用一起出现,但...