`

java之可回调的固定线程池

    博客分类:
  • java
阅读更多
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;
	}

}
分享到:
评论

相关推荐

    JAVA使用线程池查询大批量数据

    5. **结果处理**:线程池执行的任务通常不会立即返回结果,需要通过回调、阻塞等待或异步处理等方式获取并整合查询结果。例如,使用`Future`对象可以获取每个任务的执行结果。 除了`ThreadPoolExecutor`,Java还...

    java线程池的源码分析.zip

    通过`set`方法设置返回值,可以为异步任务提供结果回调机制。 6. **线程工厂**(`ThreadFactory`):线程工厂允许自定义线程的创建过程,如命名、设置优先级、初始化线程属性等。默认的线程工厂是`Executors....

    线程池 threadpool

    任务通常以回调函数的形式提交,线程池会根据当前系统状态选择合适的线程执行任务,确保资源的有效分配。 4. **线程池的大小**:线程池中的线程数量不是固定的,可以根据需求动态调整。过多的线程会导致上下文切换...

    Android下用线程池实现Http下载程序

    6. **下载进度回调**:为了实时更新下载进度,我们可以定义一个接口或者使用观察者模式,让下载任务在执行过程中回调更新进度,这样可以在UI上显示下载状态。 7. **断点续传**:为了处理网络中断或用户暂停的情况,...

    线程,线程池与Handler的用法

    为了避免这种情况,可以在Activity的`onDestroy()`方法中调用`removeCallbacksAndMessages(null)`,清理Handler中的所有回调和消息。 在实际开发中,结合线程池和Handler,我们可以实现高效且稳定的异步任务处理。...

    java并发编程

    10. **CompletableFuture**: 这是Java 8引入的一个强大工具,它支持异步编程和复杂的组合操作,如链式调用、回调和转换。 理解和掌握这些概念及工具,将有助于开发者编写出高效且线程安全的Java代码。《Java编程...

    JAVA 8 Lambda表达式-Lambda Expressions.rar

    例如,我们可以创建一个固定线程池,然后提交一系列 Runnable 对象(由 Lambda 表达式创建)到线程池执行。 在实际应用中,Lambda 表达式常用于事件驱动编程,比如 Swing 或 JavaFX 应用中的事件监听。此外,它也...

    Java-JUC-多线程 进阶

    JUC 中包括了各种锁机制、原子变量、并发集合类、线程池、异步回调等多种机制,涵盖了 Java 并发编程的多个方面。 进程和线程回顾 在 Java 中,进程(Process)和线程(Thread)是两种不同的并发编程模型。进程是...

    java小程序集锦

    这些小程序可能使用Lambda简化了回调函数或处理集合的操作。 13. **枚举与注解**:枚举类型是Java中一种特殊的类,常用于定义固定的值。注解可以为代码添加元信息,用于编译时或运行时的处理。 通过研究“Java小...

    基于技术栈Java SpringBoot实现 可以流式输出文本的飞书机器人,星火大模型机器人

    关键在于理解和使用飞书的Webhook机制,通过注册回调URL,飞书会在特定事件发生时向该URL发送POST请求。 在Spring Boot应用中,我们可以创建一个Controller来接收并处理飞书的POST请求。这个Controller应该包含一个...

    Scalable IO in Java

    ### 可扩展IO在Java中的应用 #### 概述 本次演讲由著名的Doug Lea进行,主题为“可扩展IO在Java中的应用”。Doug Lea是纽约州立大学奥斯威戈分校的一名教授,同时也是Java并发包(java.util.concurrent)的主要...

    java非阻塞通信研究

    非阻塞通信的研究还涉及到了线程池、回调函数、Promise模式等高级并发概念。线程池可以有效地管理和调度线程,减少创建和销毁线程的开销;回调函数和Promise模式则提供了处理异步操作结果的方式,使得代码更加整洁...

    基于Android的Android异步加载图像小结 (含线程池,缓存方法).zip

    3. **监听加载状态**:通过回调监听图片加载进度,可以在加载完成时更新UI,提供实时反馈。 五、实践与学习 这个压缩包包含了Android异步加载图像的详细总结,包括线程池的使用和缓存策略的实现。无论你是使用...

    Android异步加载图像小结 (含线程池,缓存方法).zip

    这些库都内置了线程池和缓存机制,并提供了丰富的功能,如图片缩放、裁剪、占位符显示、加载失败后的回调等。开发者只需要简单几行代码就可以实现复杂的图像加载需求。 五、自定义加载策略 如果对性能有更高的要求...

    Java 面试题.zip

    - Lambda表达式和函数式编程:Java 8引入的新特性,简化了回调和匿名内部类的编写。 -反射:允许程序在运行时动态地获取类的信息并调用其方法。 这个压缩包中的readme.md文件可能提供了更多关于这些面试题的详细...

    疯狂JAVA讲义

    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实现操作系统进程之间的调度

    在实际应用中,Java的并发库提供了强大的工具,如`Future`和`Callable`,它们可以用于异步计算结果,配合`CompletableFuture`可以实现复杂的依赖和回调逻辑。此外,`CyclicBarrier`和`Phaser`可以帮助实现多线程间的...

    java监听器+quartz实现每天动态时间执行任务的功能

    监听器对象注册到需要监听的组件上,当特定事件发生时,监听器会接收到通知并执行相应的回调方法。例如,一个按钮的点击事件可以通过添加ActionListener来监听,并在用户点击按钮时执行指定的代码。 在这个项目中,...

    Java源码,android多线程下载器演示

    我们可以创建一个固定大小的线程池,比如设置为CPU核心数,这样可以避免过度消耗系统资源。然后,我们将每个下载任务提交给线程池,`ExecutorService.submit()`方法会返回一个`Future`对象,我们可以用它来跟踪任务...

    互联网高频Java后端面试题20道(适合1~3年)V1.0.41.docx

    Lambda 表达式简化了函数式编程,使得处理集合、事件监听、回调等场景更为简洁。 问题 19:什么是 Hystrix 断路器?它在微服务架构中的作用是什么?答案:Hystrix 是 Netflix 开源的一个断路器库,用于隔离服务调用...

Global site tag (gtag.js) - Google Analytics