在实际开发过程中,很多时候要将子线程执行完后返回的结果给到主线程里。具体怎么实现呢?这里给出3个实现方法!
1、根据反射原理实现
很多人都习惯在调用线程的时候,通过构造方法给线程传递参数,这里我们在构造方法里传两个参数,一个是类 callback,一个是方法名 method。这样我们在线程的run方法最后 执行callback.getMethod(method).invoke(null); 这样就可能执行你指定的某个类下的某个方法了!
2、Callable+ScheduledThreadPoolExecutor实现
这个是在Java1.5以后,添加了ScheduledThreadPoolExecutor和callable两个组件(接口),ScheduledThreadPoolExecutor大家可能比较熟悉,它的优点就不说了;它用来执行线程进行调度的时候,有一个方法.schedule(Callable<Object> callable, long delay, TimeUnit unit),注意:这里的参数是Callable而不是Runnable,大家千万不要被它唬住了,其实它和Runnable差不多,都能实现有个线程,只不过Callable可以添加返回值!这正是我们想要的!
所以我们在用ScheduledThreadPoolExecutor调度线程得到返回值 ScheduledFuture后执行get()方法,就可以得到返回值了。
3、第三种就是自定义接口,把接口当初参数传进线程里,然后在线程完成的地方调用接口的方法,这个方法也是最常用的
相关推荐
这样做的好处是其他线程可以得到线程执行的结果。但如果不及时进行pthread_join(),可能会导致资源泄露,因为线程资源仍然占用,直到pthread_join()被调用。 2. **Detached状态**:当线程创建时被设置为detached...
Future接口提供方法来检测任务是否被执行完,等待任务执行完获得结果,也可以设置任务执行的超时时间。这个设置超时的方法就是实现Java程 序执行超时的关键。 Future接口是一个泛型接口,严格的格式应该是Future...
创建一个类实现`Runnable`,然后在`run()`方法中定义线程执行的逻辑。之后,将这个类的实例传递给`Thread`对象的构造函数,创建一个新的线程。 2. 继承Thread类 直接继承`Thread`类并重写`run()`方法,创建一个新...
如果锁可用,线程将获得锁并执行修改操作。之后,它必须释放锁(`pthread_mutex_unlock`),以便其他线程可以访问该资源。这样可以防止多个线程同时修改`number`,从而避免数据竞争。 `pthread_join`函数则用于等待...
- **join() 方法**:使得当前线程等待指定线程执行完毕。 - **interrupt() 方法**:中断线程,使得线程进入中断状态。 - **volatile 关键字**:保证变量的可见性和有序性。 #### 原理篇 **6. Java内存模型基础知识...
而对于实现了`Runnable`的`R`类,我们需要通过`Thread`构造器创建一个新的线程对象,并将`Runnable`实例传递进去,再调用`start()`,同样启动线程执行`run()`。 `start()`方法是启动线程的关键,它不仅执行`run()`...
- `sleep()`方法会使当前线程暂停执行指定的时间,之后线程将继续执行。这段时间内,CPU会被分配给其他线程使用。 - 使用`sleep()`方法时,即使线程处于同步块中也不会释放锁,因此其他等待该锁的线程仍然会被阻塞...
3. **临界区**:在成功获取锁之后,线程可以安全地访问临界资源。这个区域被称为临界区,因为只有获得锁的线程才能进入。 4. **解锁**:完成对临界资源的操作后,线程必须调用`unlock()`来释放锁,允许其他等待的...
- **竞争条件**:当两个或多个线程同时访问共享资源且结果依赖于线程执行的顺序时发生。可以通过加锁来解决。 - **Thread Dump**:是一种调试工具,用于获取应用程序所有线程的快照。在Unix系统中,可以使用`kill -3...
Java并发控制问题是国内外学者研究的热点之一,特别是在J2SE 1.5版本中引入了`java.util.concurrent`包之后,Java并发编程得到了更广泛的关注和发展。为了确保程序在多线程环境下的正确性,理解线程安全性(Thread ...
如果多个线程试图同时访问同一个`synchronized`代码块,则只有一个线程可以获得锁并执行代码。 - **3.2 volatile关键字** `volatile`关键字用于标记可能被不同线程访问的变量,确保其值的可见性和禁止指令重排序。...
2. **就绪(Runnable)**:当线程对象调用了`start()`方法之后,该线程处于就绪状态。此时,线程已经准备好运行,等待操作系统为其分配CPU时间片。 3. **运行(Running)**:获得CPU时间片后,线程进入运行状态。 4....
- `join()` 方法使当前线程等待另一个线程完成之后再继续执行。如果在某个线程中调用另一个线程的join()方法,则当前线程进入阻塞状态,直到另一个线程完成执行。 - `yield()` 方法作用是让步当前正在执行的线程...
例如,在上面的代码中,线程 A 调用了同步对象的 wait() 方法释放了锁并进入 WAITING 状态,而线程 B 调用了 notify() 方法,这样线程 A 收到通知之后就可以从 wait() 方法中返回。 二、Java 线程通信的实现方式 ...
即在调用线程实例的`start()`方法之后,该方法会立即返回,但如果调用`start()`方法后需要使用一个由该线程计算得到的值,则必须使用`join()`方法来确保主线程等待目标线程完成计算。 **示例代码:** ```java ...
在Java 5.0版本中,多线程编程得到了显著增强,特别是在引入了`java.util.concurrent`包之后,为开发者提供了更为丰富的API来处理并发问题。本篇文章将深入探讨如何在Java 5.0中有效地运用这些新特性来进行多线程...
2. 在类中重写`run()`方法,定义线程执行的具体逻辑。 3. 创建该类的一个实例。 4. 使用该实例创建一个`Thread`对象,并调用`start()`方法启动线程。 **3.2 Thread类的常用方法** - `getName()`:获取当前线程的...