【问题标题】:Java Concurrency & TasksJava 并发和任务
【发布时间】:2012-05-02 00:31:02
【问题描述】:

当谈到 Java 领域的多线程和并发时,共识是将您想要多线程的代码隔离为“任务”,并将该任务提交给某种执行器服务或线程池。

我想知道的是:

  • 任务可以是 any 对象的 any 方法,还是必须是特殊的东西(如果是,是什么)?
  • 您如何确定此任务是否受 CPU、IO 限制或其他限制?有哪些“致命的赠品”或其他决定因素?

在此先感谢您的澄清!

【问题讨论】:

  • 确定代码是 io 还是 cpu 绑定的方法是在分析器中运行它。其他任何事情都只是猜测,通常是错误的。
  • @jtahlborn - 好吧,如果任务包含 DNS 查找,然后从网站下载,那确实提供了一个线索,表明它将是 I/O 绑定的。这不是猜测;)
  • @MartinJames - 仍然是一个猜测。可能是从同一局域网上的另一台计算机下载(或一个非常小的文件),然后对结果进行一些疯狂的计算。

标签: java multithreading concurrency


【解决方案1】:

看看ExecutorService

  • submit(Callable)
  • submit(Runnable)

您的任务可能应该是两个接口之一(它总是可以调用其他方法)。

如果您在其中执行任何输入/输出操作,您的任务可能是 IO 绑定的:IE、读取文件、写入文件、从套接字读取、写入套接字等。

【讨论】:

  • 所以,ExecutorService 只是调用任务的run()call() 方法(以适用者为准),然后无论该方法的定义是什么确定了任务的约束条件?这是一个公平的概括吗?
  • @AdamTannon 这就是总结。也请查看 jtahlborn 对您的原始问题的评论。
【解决方案2】:

Threads 通常会执行他们在实现Runnable 的类中找到的代码。

【讨论】:

    【解决方案3】:

    任务可以是任何对象的任何方法,还是必须是特殊的东西(如果是,是什么)?

    它可以是任何东西。最大的问题是您的任务可能会包含一些与其他线程共享的对象。您必须确保对这些对象的访问是线程安全的。这是一个复杂的话题; Goetz 等人的《Java Concurrency in Practice》是一本非常好的书。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多