import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* 线程池
* @author jynine
*
*/
public class ThreadPools {
private ThreadPoolExecutor threadPool;//线程池
private Map<String, Object> objs;
private ThreadPools(){
//初始5 最大5
threadPool = new ThreadPoolExecutor(5, 5, 1,
TimeUnit.MICROSECONDS, new LinkedBlockingQueue<Runnable>());
objs =new ConcurrentHashMap<String, Object>();
}
private static ThreadPools instance = new ThreadPools();
/**
* 获取单例对象
* @return
*/
public static ThreadPools getInstance()
{
return instance;
}
/**
* 执行线程
* @param callCallable
* 回调任务
* @param uuid
* 唯一标识
* @throws ExecutionException
* @throws InterruptedException
*/
public void excuteThread(MyCallable callable,String uuid) throws InterruptedException, ExecutionException{
Future<Object> future = threadPool.submit(callable);
Object reObjs = future.get();
objs.put(uuid, reObjs);
}
/**
* 得到线程池返回值
* @param uuid 唯一标识
* @return
* @throws InterruptedException
*/
public Object getReturnObjs(String uuid) throws InterruptedException{
long st = System.currentTimeMillis();
while (true) {
Object temp = objs.get(uuid);
if(temp != null){
objs.remove(uuid);
return temp;
}else{
//15秒超时
if((System.currentTimeMillis() - st) > 15 * 1000){
return null;
}else{
Thread.sleep(1000);
}
}
}
}
/**
* 关闭线程池
* @throws Exception
*/
public void shutDown() throws Exception{
threadPool.shutdown();
}
}
import java.util.concurrent.Callable;
/**
* 回调任务
* @author jynine
*
*/
public class MyCallable implements Callable<Object> {
private int index;
public MyCallable(int index) {
this.index = index;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
@Override
public Object call() throws Exception {
return "call"+index;
}
}
分享到:
相关推荐
5. **结果处理**:线程池执行的任务通常不会立即返回结果,需要通过回调、阻塞等待或异步处理等方式获取并整合查询结果。例如,使用`Future`对象可以获取每个任务的执行结果。 除了`ThreadPoolExecutor`,Java还...
通过`set`方法设置返回值,可以为异步任务提供结果回调机制。 6. **线程工厂**(`ThreadFactory`):线程工厂允许自定义线程的创建过程,如命名、设置优先级、初始化线程属性等。默认的线程工厂是`Executors....
任务通常以回调函数的形式提交,线程池会根据当前系统状态选择合适的线程执行任务,确保资源的有效分配。 4. **线程池的大小**:线程池中的线程数量不是固定的,可以根据需求动态调整。过多的线程会导致上下文切换...
6. **下载进度回调**:为了实时更新下载进度,我们可以定义一个接口或者使用观察者模式,让下载任务在执行过程中回调更新进度,这样可以在UI上显示下载状态。 7. **断点续传**:为了处理网络中断或用户暂停的情况,...
为了避免这种情况,可以在Activity的`onDestroy()`方法中调用`removeCallbacksAndMessages(null)`,清理Handler中的所有回调和消息。 在实际开发中,结合线程池和Handler,我们可以实现高效且稳定的异步任务处理。...
10. **CompletableFuture**: 这是Java 8引入的一个强大工具,它支持异步编程和复杂的组合操作,如链式调用、回调和转换。 理解和掌握这些概念及工具,将有助于开发者编写出高效且线程安全的Java代码。《Java编程...
例如,我们可以创建一个固定线程池,然后提交一系列 Runnable 对象(由 Lambda 表达式创建)到线程池执行。 在实际应用中,Lambda 表达式常用于事件驱动编程,比如 Swing 或 JavaFX 应用中的事件监听。此外,它也...
JUC 中包括了各种锁机制、原子变量、并发集合类、线程池、异步回调等多种机制,涵盖了 Java 并发编程的多个方面。 进程和线程回顾 在 Java 中,进程(Process)和线程(Thread)是两种不同的并发编程模型。进程是...
这些小程序可能使用Lambda简化了回调函数或处理集合的操作。 13. **枚举与注解**:枚举类型是Java中一种特殊的类,常用于定义固定的值。注解可以为代码添加元信息,用于编译时或运行时的处理。 通过研究“Java小...
关键在于理解和使用飞书的Webhook机制,通过注册回调URL,飞书会在特定事件发生时向该URL发送POST请求。 在Spring Boot应用中,我们可以创建一个Controller来接收并处理飞书的POST请求。这个Controller应该包含一个...
### 可扩展IO在Java中的应用 #### 概述 本次演讲由著名的Doug Lea进行,主题为“可扩展IO在Java中的应用”。Doug Lea是纽约州立大学奥斯威戈分校的一名教授,同时也是Java并发包(java.util.concurrent)的主要...
非阻塞通信的研究还涉及到了线程池、回调函数、Promise模式等高级并发概念。线程池可以有效地管理和调度线程,减少创建和销毁线程的开销;回调函数和Promise模式则提供了处理异步操作结果的方式,使得代码更加整洁...
3. **监听加载状态**:通过回调监听图片加载进度,可以在加载完成时更新UI,提供实时反馈。 五、实践与学习 这个压缩包包含了Android异步加载图像的详细总结,包括线程池的使用和缓存策略的实现。无论你是使用...
这些库都内置了线程池和缓存机制,并提供了丰富的功能,如图片缩放、裁剪、占位符显示、加载失败后的回调等。开发者只需要简单几行代码就可以实现复杂的图像加载需求。 五、自定义加载策略 如果对性能有更高的要求...
- Lambda表达式和函数式编程:Java 8引入的新特性,简化了回调和匿名内部类的编写。 -反射:允许程序在运行时动态地获取类的信息并调用其方法。 这个压缩包中的readme.md文件可能提供了更多关于这些面试题的详细...
6.7.6 闭包(Closure)和回调 215 6.8 枚举类 217 6.8.1 手动实现枚举类 217 6.8.2 枚举类入门 219 6.8.3 枚举类的属性、方法和构造器 220 6.8.4 实现接口的枚举类 223 6.8.5 包含抽象方法的枚举类 224 6.9 ...
在实际应用中,Java的并发库提供了强大的工具,如`Future`和`Callable`,它们可以用于异步计算结果,配合`CompletableFuture`可以实现复杂的依赖和回调逻辑。此外,`CyclicBarrier`和`Phaser`可以帮助实现多线程间的...
监听器对象注册到需要监听的组件上,当特定事件发生时,监听器会接收到通知并执行相应的回调方法。例如,一个按钮的点击事件可以通过添加ActionListener来监听,并在用户点击按钮时执行指定的代码。 在这个项目中,...
我们可以创建一个固定大小的线程池,比如设置为CPU核心数,这样可以避免过度消耗系统资源。然后,我们将每个下载任务提交给线程池,`ExecutorService.submit()`方法会返回一个`Future`对象,我们可以用它来跟踪任务...
Lambda 表达式简化了函数式编程,使得处理集合、事件监听、回调等场景更为简洁。 问题 19:什么是 Hystrix 断路器?它在微服务架构中的作用是什么?答案:Hystrix 是 Netflix 开源的一个断路器库,用于隔离服务调用...