本文主要是介绍Java 线程池+分布式实现代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要...
1. 线程池
在 Java 开发中,"池" 通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率。常见的池包括:
核心思想:用一个集合来维护固定大小或可配置的资源,当需要使用资源时从池中获取,使用完毕后归还给池,而不是直接销毁。
1.1 自定义线程池实现
1.1.1 线程池核心
PoolInit:线程池初始化和任务管理
ThreadPool:线程池核心类,管理工作线程
WorkThread:工作线程类,执行具体任务
1.1.2 代码示例
1.1.2.1 PoolInit
package com.lj.demo5; import java.util.LinkedList; import java.util.Scanner; /** * 多线程与集合综合应用示例 * 演示线程池的初始化和任务提交过程 * * 应用场景: * 如QQ聊天服务器,面对大量用户连接时, * 使用线程池管理线程资源比为每个用户创建新线程更高效 */ public class PoolInit { // 存储待执行任务的链表,作为任务队列 public static LinkedList<String> linkTaskName = new LinkedList<String>(); // 线程池实例 public static ThreadPool t; public PoolInit() { // 初始化线程池,指定核心线程数为3 t = new ThreadPool(3); // 从控制台接收任务并提交给线程池 Scanner scanner = new Scanner(System.in); String taskName = ""; while (true) { System.out.println("请输入线程需要处理的任务名称:"); taskName = scanner.next(); // 将任务添加到任务队列 linkTaskName.add(taskName); // 提交第一个任务给线程池执行 t.executeTask(linkTaskName.get(0)); } } public static void main(String[] args) { // 启动线程池 new PoolInit(); } }
LinkTaskName:使用 LinkedList 作为任务队列,存储待执行的任务,构造方法中初始化线程池,并通过控制台接收用户输入的任务,每当有新任务输入,先添加到任务队列,再提交给线程池执行。
1.1.2.2 ThreadPool
package com.lj.demo5; import java.util.Vector; /** * 线程池核心类 * 管理工作线程,负责任务的分配与调度 */ public class ThreadPool { // 线程池大小 private int num; // 存储工作线程的集合,使用Vector保证线程安全 Vector<Runnable> vectors ; /** * 构造方法,初始化线程池 * @param num 线程池中的线程数量 */ public ThreadPool(int num) { this.num = num; // 初始化线程集合,容量为指定的线程数量 this.veOxPjTHZctors = new Vector<Runnable>(this.num); System.out.println("线程集合当前大小:" + this.vectors.size()); System.out.println("线程集合容量:" + this.vectors.capacity()); // 创建指定数量的工作线程并启动 for(int i=0;i<this.vectors.capacity();i++) { WorkThread w = new WorkThread(); this.vectors.add(w); w.start()javascript; // 启动工作线程 } } /** * 执行任务方法 * 查找空闲线程并分配任务 * @param taskName 任务名称 */ public void executeTask(String taskName) { // 遍历线程池中的线程,寻找空闲线程 for(int i=0;i<this.vectors.capacity();i++) { WorkThread w = (WorkThread) this.vectors.get(i); System.out.println("线程池中的线程" + w.getName() + "的状态为:" + w.isFlag()); // 如果线程处于空闲状态(flag为false) if(!w.isFlag()) { System.out.println(w.getName() + ",现在是空闲状态,分配新任务"); // 设置线程为忙碌状态 w.setFlag(true); // 分配任务 w.setTaskName(taskName); // 从任务队列移除已分配的任务 PoolInit.linkTaskName.remove(0); break; // 找到空闲线程后退出循环 } } } }
使用 Vector 存储工作线程,因为 Vector 是线程安全的集合,构造方法中创建并启动指定数量的工作线程
executeTask()方法将任务分配给空闲线程:
遍历所有工作线程,检查线程状态
找到空闲线程后,设置线程状态为忙碌,分配任务
从任务队列中移除已分配的任务
1.1.2.3 WorkThread
package com.lj.demo5; /** * 工作线程类 * 实际执行任务的线程 */ public class WorkThread extends Thread { // 线程状态标志:false表示空闲,true表示忙碌 privatjse boolean flag; // 当前执行的任务名称 private String taskName; /** * 线程运行方法 * 循环处理任务:有任务则执行,无任务则等待 */ @Override public synchronized void run() { while (true) { if (this.isFlag()) { // 有任务要执行 System.out.println(Thread.currentThread().getName() + "正在执行任务:" + this.taskName); try { // 模拟任务执行时间(30秒) Thread.sleep(30 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "已完成任务:" + this.taskName + ",状态变为空闲"); // 任务完成,设置为空闲状态 this.setFlag(false); } else { // 无任务 System.out.println("任务队列中等待的任务数量:" + PoolInit.linkTaskName.size()); // 检查是否有未处理的任务 if (PoolInit.linkTaskName.size() > 0) { String taskName = PoolInit.linkTaskName.get(0); PoolInit.t.executeTask(taskName); System.out.println(Thread.currentThread().getName() + "发现未处理任务,尝试处理:" + taskName); } else { 编程 System.out.println(Thread.currentThread().getName() + ":当前没有任务,进入等待状态..."); try { // 进入等待状态,释放锁 this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } // getter和setter方法 public boolean isFlag() { return flag; } /** * 设置线程状态 * 当设置为忙碌状态时,唤醒等待的线程 */ public synchronized void setFlag(boolean flag) { this.flag = flag; if (this.flag) { // 有新任务,唤醒线程 this.notify(); } } public String getTaskName() { return taskName; } public void setTaskName(String taskName) { this.taskName = taskName; } }
flag变量用于标识线程状态:false(空闲),true(忙碌)
run()方法是线程的核心,通过循环处理任务:
- 当有任务时(flag=true),执行任务并休眠模拟处理时间
任务完成后,将线程状态设为空闲
- 当无任务时(flag=false),检查任务队列是否有等待任务
如果有等待任务,通知线程池分配任务;如果没有,则进入等待状态
1.2 总结流程
- 初始化线程池,创建指定数量的工作线程并启动
- 工作线程启动后进入等待状态,等待接收任务
- 用户输入任务,添加到任务队列
- 线程池查找空闲线程,分配任务并唤醒线程
- 线程执行任务,完成后回到空闲状态
- 重复步骤 3-5,直到程序结束
2. Java分布式处理
分布式系统是由多个独立计算机组成的系统,这些计算机通过网络协同工作,对外表现为一个整体。
下面我通过 WebService 实现一个简单的分布式服务。
2.1 WebService 服务接口
package com.lj.data; import javax.jws.WebMethod; import javax.jws.WebService; /** * WebService服务接口 * 定义远程可调用的方法 * * RPC(远程过程调用)机制: * - RMI:客户端和服务器端都必须是Java * - WebService:支持跨语言、跨平台通信 * - 其他:hessian, thrift, grpc, dubbo等 */ @WebService(targetNamespace = "http://lj.com/wsdl") public interface IAdminService { /** * 定义WebService方法 * @return 字符串结果 */ @WebMethod public String queryStr(); }
2.2 WebService 服务实现
package com.lj.data.impl; import javax.jws.WebService; import com.lj.data.IAdminService; /** * WebService服务实现类 * 提供接口中定义的方法的具体实现 */ @WebService( portName = "admin",//端口名称 serviceName = "AdminServiceImpl",//服务名称 targetNamespace = "http://lj.com/wsdl",//必须与接口的命名空间一致 endpointInterface = "com.lj.data.IAdminService"//指定实现的接口 ) public class AdminServiceImpl implements IAdminService { /** * 实现查询方法 * @return 返回示例字符串 */ @Override public String queryStr() { return "你好,世界"; } }
2.3 发布 WebService 服务
package com.lj.webserviceclient; import javax.XML.ws.Endpoint; import com.lj.data.IAdminService; import com.lj.data.impl.AdminServiceImpl; /** * WebService服务发布类 * 将服务发布到指定地址,供客户端调用 */ public class App { public static void main(String[] args) { System.out.println("开始发布WebService远程服务..."); // 创建服务实现类实例 IAdminService adminService = new AdminServiceImpl(); // 发布服务,指定服务地址 Endpoint.publish("http://127.0.0.1:8225/AdminServiceImpl/admin", adminService); System.out.println("WebService服务发布成功!"); } }
3.4 WebService 客户端调用
package com.lj.webserviceclient; import java.net.URL; import javax.xml.namespace.QName; import javax.xml.ws.Service; import com.lj.data.IAdminService; /** * WebService客户端 * 调用远程发布的WebService服务 */ public class App { public static void main(String[] args) { try { // 服务的URL地址 URL url = new URL("http://127.0.0.1:8225/AdminServiceImpl/admin"); // 创建QName对象,指定命名空间和服务名称 QName qname = new QName("http://lj.com/wsdl", "AdminServiceImpl"); // 创建Service对象 Service service = Service.create(url, qname); // 获取服务接口实例 IAdminServiceChina编程 adminService = service.getPort(IAdminService.class); // 调用远程方法 String message = adminService.queryStr(); System.out.println("调用远程WebService服务的结果为: " + message); } catch (Exception e) { e.printStackTrace(); } } }
到此这篇关于Java 线程池+分布式实现代码的文章就介绍到这了,更多相关Java 线程池+分布式内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!
这篇关于Java 线程池+分布式实现代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!