【问题标题】:Java Multi Threading - real world use casesJava 多线程 - 真实世界的用例
【发布时间】:2012-01-07 16:35:33
【问题描述】:

我想研究多线程,但我目前的项目没有这样的机会。有人可以指导我应该从哪里开始。我需要实时场景,以便我可以直接跳到编码。我也在并排阅读。

你可以参考一些网站练习吗?

【问题讨论】:

  • stackoverflow.com/questions/1835076/… 我觉得这个链接可能对你有帮助
  • 我喜欢那个链接,尤其是。客户端-服务器应用程序的建议。 @Suman_Sohal,如果你有数学倾向,矩阵运算,比如乘法,是学习多线程的经典。
  • 我假设您的意思是阅读世界,而不是实时。
  • @vinay 链接已损坏。请更新。

标签: java multithreading


【解决方案1】:

当单线程需要很长时间才能完成计算活动时,您应该将其分解为小任务并使用多线程来减少计算时间。

您可以在项目中看到很多多线程用例。

  1. 有些任务可以独立运行而无需依赖其他任务(只需跨越一个新的Thread 或将Runnable/Callable 任务提交给ExecutorService/ThreadPoolExecutor

  2. 当您需要等待多个并行任务完成才能继续下一个任务时(invokeAll()

    例如任务 1 启动三个独立的任务任务 2、任务 3 和任务 4,但任务 5 必须在任务 2、任务 3 和任务 4 完成后启动。

 Task 1              
----->               
         Task 2
         ----->
         Task 3
         ----->
         Task 4
         ----->
                  Task 5
-------------------------->
                  
  1. 系统能够使用多个 CPU 内核
  2. 当您有 Fork-Join 任务等用例时(使用:ForkJoinPool
  3. 当你想显示长计算任务的进度时(进度条可以在一个线程中显示,长计算任务可以由另一个线程执行)

相关帖子:

How to properly use Java Executor?

Whether to use invokeAll or submit - java Executor service

Java's Fork/Join vs ExecutorService - when to use which?

wait until all threads finish their work in java

【讨论】:

    【解决方案2】:

    由用户级线程模拟的多线程。这些线程是在应用程序级别而不是操作系统内核级别实现的。

    这些线程也被称为绿色线程,因为,如此新鲜(全新)和年轻(未成熟或成熟)。

    现实世界的用例

    • 电脑游戏中,汽车、摩托车等对象只是线程。
    • 异步通信可以让应用程序执行额外的任务,而不是等待任务完成。
    • 具有许多可以按任意顺序执行的任务的应用程序通常可以从分布式异步通信中受益。

    【讨论】:

      【解决方案3】:

      我建议您设计以下系统以从主题开始:

      1. 电梯(3行)考虑以下参数:

        能源消耗,即最近的电梯将接受您的请求,具体取决于它是向上移动还是现在移动以及用户请求,电梯重量

        时间消耗。

      2. 多个用户可以的文件读写器系统:

        Edit/Write/Search/Delete a file

      【讨论】:

        【解决方案4】:

        Google 可以将您转到练习教程网站(比我做的好得多)。一个不错的实时场景可以包括以下任何一项(可能看起来很学术,但这些技能绝对可以转移到实践中):

        1. 餐饮哲学家的问题。
        2. 读写器问题。
        3. 消费者/生产者问题。

        一些更具体的:

        1. 并发 alpha-beta 搜索(这非常棘手)。
        2. 任何遗传算法都可以同时实现,并且由于内存/存储在线程之间共享,如果做得好,可能会非常具有挑战性(尝试使用半透明多边形绘制图像项目。您可以在 google 上搜索)。李>
        3. 并发数据库访问可能非常有趣。为自己画一个场景。
        4. 查看http://projecteuler.net/,其中包含许多有趣的问题。那里的许多问题都可以使用线程来解决。

        享受。

        【讨论】:

        • 不,谷歌做不到。它将提供并发教程和书籍。有时非常过时。
        【解决方案5】:

        Java 有几个问题急需多线程解决方案。我最近遇到并解决的两个问题是:

        • 如果文件夹中有数千个文件,File.list 会出现可怕的问题。
        • SAXParser.parse 是一个推送解析器。许多 xml 用户更喜欢拉式解析器,但不想再添加另一个库。

        使用简单的双线程解决方案可以极大地帮助这两个方面。

        对于 File.list,在单独的线程中运行 File.list,并使用特殊的 FileFilter 将提交给它的所有文件发布到 BlockingQueue。然后可以使用BlockingQueue 上的迭代器将文件传递给调用者。如果代码编写正确,递归列出目录的增强功能很容易添加。

        SAXParser.parse 可以以类似的方式由内向外翻转。

        我最近做了这两件事,觉得这段经历很有启发性。

        【讨论】:

          【解决方案6】:

          我想看看disruptor 库。这引入了许多先进的多线程概念,一旦你理解并使用它,你就会比大多数人了解更多。

          【讨论】:

          • 如果提问者想了解线程,这个库可能有点太多了。概念和实现非常先进。
          • @RobertMunteanu,正如你所说,这不是一个好的起点,但如果他想测试他对多线程的理解,它可能会有所帮助。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-23
          • 2016-11-26
          • 1970-01-01
          • 2011-12-26
          • 2012-05-23
          • 1970-01-01
          相关资源
          最近更新 更多