Java多线程的使用(使用Java多线程实现任务分发)

2024-02-21 13:40:02 :42

java多线程的使用(使用Java多线程实现任务分发)

各位老铁们好,相信很多人对java多线程的使用都不是特别的了解,因此呢,今天就来为大家分享下关于java多线程的使用以及使用Java多线程实现任务分发的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

本文目录

使用Java多线程实现任务分发

  多线程下载由来已久 如 FlashGet NetAnts 等工具 它们都是依懒于 HTTP 协议的支持(Range 字段指定请求内容范围) 首先能读取出请求内容 (即欲下载的文件) 的大小 划分出若干区块 把区块分段分发给每个线程去下载 线程从本段起始处下载数据及至段尾 多个线程下载的内容最终会写入到同一个文件中

  只研究有用的 工作中的需求 要把多个任务分派给Java的多个线程去执行 这其中就会有一个任务列表指派到线程的策略思考 已知 一个待执行的任务列表 指定要启动的线程数 问题是 每个线程实际要执行哪些任务

  使用Java多线程实现这种任务分发的策略是 任务列表连续按线程数分段 先保证每线程平均能分配到的任务数 余下的任务从前至后依次附加到线程中——只是数量上 实际每个线程执行的任务都还是连续的 如果出现那种僧多(线程) 粥(任务) 少的情况 实际启动的线程数就等于任务数 一挑一 这里只实现了每个线程各扫自家门前雪 动作快的完成后眼见别的线程再累都是爱莫能助

  实现及演示代码如下 由三个类实现 写在了一个 Java 文件中 TaskDistributor 为任务分发器 Task 为待执行的任务 WorkThread 为自定的工作线程 代码中运用了命令模式 如若能配以监听器 用上观察者模式来控制 UI 显示就更绝妙不过了 就能实现像下载中的区块着色跳跃的动感了 在此定义下一步的着眼点了

  代码中有较为详细的注释 看这些注释和执行结果就很容易理解的 main() 是测试方法

  

  package mon;import java util ArrayList;import java util List;/*** 指派任务列表给线程的分发器* @author Unmi* QQ: Email: * MSN: */public class TaskDistributor {/*** 测试方法* @param args*/public static void main(String add(taskList get(taskIndex++));remainIndces ;}}// 打印任务的分配情况for (int i = ; i 《 taskListPerThread length; i++) {System out println( 线程 + i + 的任务数 +

  taskListPerThread );}return taskListPerThread;}}/*** 要执行的任务 可在执行时改变它的某个状态或调用它的某个操作* 例如任务有三个状态 就绪 运行 完成 默认为就绪态* 要进一步完善 可为 Task 加上状态变迁的监听器 因之决定UI的显示*/class Task {public static final int READY = ;public static final int RUNNING = ;public static final int FINISHED = ;private int status;//声明一个任务的自有业务含义的变量 用于标识任务private int taskId;//任务的初始化方法public Task(int taskId){this status = READY;this taskId = taskId;}/*** 执行任务*/public void execute() {// 设置状态为运行中setStatus(Task RUNNING);System out println( 当前线程 ID 是 + Thread currentThread() getName()+ | 任务 ID 是 +this taskId);// 附加一个延时try {Thread sleep( );} catch (InterruptedException e) {e printStackTrace();}// 执行完成 改状态为完成setStatus(FINISHED);}public void setStatus(int status) {this status = status;}public int getTaskId() {return taskId;}}/*** 自定义的工作线程 持有分派给它执行的任务列表*/class WorkThread extends Thread {//本线程待执行的任务列表 你也可以指为任务索引的起始值private List taskList = null;private int threadId;/*** 构造工作线程 为其指派任务列表 及命名线程 ID* @param taskList 欲执行的任务列表* @param threadId 线程 ID*/public WorkThread(List taskList int threadId) {this taskList = taskList;this threadId = threadId;}/*** 执行被指派的所有任务*/public void run() {for (Task task : taskList) {task execute();}}}

  执行结果如下 注意观察每个Java多线程分配到的任务数量及区间 直到所有的线程完成了所分配到的任务后程序结束

  

  线程 的任务数 区间实际要启动的工作线程数 当前线程 ID 是 Thread | 任务 ID 是 当前线程 ID 是 Thread | 任务 ID 是 当前线程 ID 是 Thread | 任务 ID 是 当前线程 ID 是 Thread | 任务 ID 是 当前线程 ID 是 Thread | 任务 ID 是 当前线程 ID 是 Thread | 任务 ID 是 当前线程 ID 是 Thread | 任务 ID 是 当前线程 ID 是 Thread | 任务 ID 是

  上面坦白来只算是基本功夫 贴出来还真见笑了 还有更为复杂的功能

lishixinzhi/Article/program/Java/gj/201311/27443

Java多线程问题总结

Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多、越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的。java课程培训机构认为这篇文章主要是对多线程的问题进行总结的,因此罗列了多个多线程的问题。

这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。

(1)发挥多核CPU的优势

随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4核、8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。单核CPU上所谓的”多线程”那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程”同时”运行罢了。多核CPU上的多线程才是真正的多线程,它能让你的多段逻辑同时工作,多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的。

(2)防止阻塞

从程序运行效率的角度来看,单核CPU不但不会发挥出多线程的优势,反而会因为在单核CPU上运行多线程导致线程上下文的切换,而降低程序整体的效率。但是单核CPU我们还是要应用多线程,就是为了防止阻塞。试想,如果单核CPU使用单线程,那么只要这个线程阻塞了,比方说远程读取某个数据吧,对端迟迟未返回又没有设置超时时间,那么你的整个程序在数据返回回来之前就停止运行了。多线程可以防止这个问题,多条线程同时运行,哪怕一条线程的代码执行读取数据阻塞,也不会影响其它任务的执行。

(3)便于建模

这是另外一个没有这么明显的优点了。假设有一个大的任务A,单线程编程,那么就要考虑很多,建立整个程序模型比较麻烦。但是如果把这个大的任务A分解成几个小任务,任务B、任务C、任务D,分别建立程序模型,并通过多线程分别运行这几个任务,那就简单很多了。

java多线程用在快递系统中能做什么

Java 多线程可以在快递系统中用来执行多个任务并发地。这样就可以提升系统的效率,同时也能更好地利用计算机的多核处理能力。例如,在快递系统中,你可以使用多线程来并发地处理不同的订单。在一个线程中处理一个订单的打印工作,在另一个线程中处理另一个订单的装袋工作,以此类推。这样就可以让系统在同一时间内处理更多的订单,从而提升效现。此外,你还可以使用多线程来实现更复杂的功能,例如路径规划、货物追踪等。总的来说,Java 多线程在快递系统中有很多的应用场景,可以帮助你实现更高效、更灵活的系统。

文章分享结束,java多线程的使用和使用Java多线程实现任务分发的答案你都知道了吗?欢迎再次光临本站哦!

java多线程的使用(使用Java多线程实现任务分发)

本文编辑:admin
Copyright © 2022 All Rights Reserved 威海上格软件有限公司 版权所有

鲁ICP备20007704号

Thanks for visiting my site.