问题标签 [callable]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 取消我没有写的动态加载的 Callables
我有一些代码可以从目录中的多个 JAR 动态加载类。因为 JAR 中的代码是不受信任的,所以我希望通过“沙箱化”它们来保护主应用程序免受编码不良或恶意动态类的影响。我正在尝试做的一件事是“timebox”不受信任的代码的执行,如果它花费的时间太长,则将其杀死(例如,因为它陷入了无限循环)。我正在尝试使用 Callable 和 Future 来实现这一点,不是因为我想并行运行任务(我不这样做),而是为了利用已完成的工作来提供返回值、捕获异常并取消正在运行的任务。但是,当我在一些测试代码上运行它时,我发现调用 Future.cancel(true) 似乎并没有取消任务。
我在 StackOverflow 上看到了几个关于为什么会发生这种情况的问题(例如这个),答案总是一样的:cancel(true) 通过在运行 Callable 的线程上调用 interrupt() 来工作,这需要取消取消生效之前的可中断()操作(例如 Thread.sleep())上的任务块。因为我不控制正在执行的代码,所以不能保证它会这样做,所以我不能确定我已经取消了它。
有什么方法可以让我运行动态加载的代码,然后在进行中杀死它并确保它死掉,即使它从不阻塞中断()可操作的操作?
java - 多线程文件处理和报告
我有一个应用程序,它处理存储在输入目录中的多个文件中的数据,然后根据该数据生成一些输出。
到目前为止,应用程序是按顺序工作的,即它启动一个“管理器”线程,
- 将输入目录的内容读入
File[]
数组 - 按顺序处理每个文件并存储结果
- 处理完所有文件后终止
我想将其转换为多线程应用程序,其中“管理器”线程
- 将输入目录的内容读入
File[]
数组 - 启动多个“处理器”线程,每个线程处理单个文件、存储结果并将该文件的摘要报告返回给“管理器”线程
- 处理完所有文件后终止
“处理器”线程的数量最多等于文件的数量,因为它们将通过ThreadPoolExecutor
.
任何避免使用join()
or的解决方案wait()/notify()
都是可取的。
基于以上场景:
- 让那些“处理器”线程向“管理器”线程报告的最佳方式是什么?一个基于这里的实现
Callable
是否Future
有意义? - “管理器”线程如何知道所有“处理器”线程何时完成,即所有文件何时处理完毕?
- 有没有办法“定时”处理器线程并在它“太长”时终止它(即,尽管经过了预先配置的时间量,它还没有返回结果)?
任何指向(伪)源代码的指针或示例将不胜感激。
java - 最快的同步技术
以下是访问公共资源的一种相当常见的场景,以顺序(单线程)或并发(多线程)方式,需要最快的技术。
更具体地说(参见下面的示例源代码),一个Manager
类创建了一个Runnable
(或Callable
)类(Handler
)的一些实例,这些实例具有一个公共资源(一个Store
对象)。该类Manager
实际上是子类化的,并且其execute()
方法被重写以在同一个线程中或在多个线程中(例如,通过一个ExecutorService
)顺序运行处理程序,具体取决于子类的实现。
我的问题是,在每个对象的(or ) 方法中同步访问共享Store
对象的最快(更少开销)方法是什么,特别是考虑到对于单线程访问,同步是多余的(但有在那里,因为还有多线程子类实现)。run
call()
Handler
Manager
例如,一个synchronized (this.store) {this.store.process()}
块会比在调用之前和之后使用Lock
对象更好吗?或者每个商店访问内部的单独方法会更快吗?例如,而不是调用,运行类似java.util.concurrent
this.store.process()
synchronized
Handler
this.store.process()
以下是(示例)源代码。
java - 为什么增加 newFixedThreadPool 会导致性能不佳?
我正在尝试更改报告的执行并使其同时完成。在“串行模式”中,执行测试需要 30 秒,而在使用并发模式时,我需要 27 秒(考虑到必须串行执行几个步骤,我对结果没问题)。
我仍然没有得到的是这一行:
我的计算机配备了 2x2.6 Ghz 四核,如果 newFixedThreadPool 很高 (16),我希望执行时间会减少。实际上,我增加的 newFixedThreadPool 越多,执行速度就越慢。这就引出了一个问题:我做错了什么或者我没有理解什么?!?!
我从我的执行中嵌入了 2 个结果屏幕截图。
A. newSingleThreadExecuter - 在 23 秒内运行
B. newFixedThreadPool(4) - 在 43 秒内运行。
每次我提交“工人”时,我都会得到 system.out currentTimeMillis,“fatched tkt”结果是从数据库获取数据所需的毫秒数。(在策略 A 中 - 大约需要 3 毫秒,在 B 中最多需要 7 毫秒)。
java - java.util.concurrent 多线程
我最近开始搞乱 java.util.concurrent,我希望有人能指出我的代码中的缺陷或坏习惯。
程序运行直到超时,然后输出所有已完成的任务。
- 在这种情况下我应该使用 ArrayList 吗?
- 是否有更适合此任务的类,它可能更线程安全。
- 任何建设性的批评都会有所帮助。
主班
可调用
submit - 检索通过 ExecutorService.submit 执行的对象
我有一个并行运行多个求解器的 ExecutorService。每个求解器都会修改几个必须返回值的内部变量。由于兼容性问题,不可能将所有变量封装在一个类中以通过可调用对象返回。因此,使求解器可调用或可运行对我的情况没有任何影响,因为我无法检索我需要的所有变量。
我考虑了以下两个选项:
- 每个求解器访问一个同步类并将其值写入那里。
- 访问 executor 提交的对象(求解器),以便通过 get 方法获取它们的变量。
我更喜欢第二种选择,但我找不到访问提交对象的方法。
有什么建议(对于任何选项)?
java - 使用线程
我有以下任务:
- 从网上下载图片
- 使用它创建另一个图像
- 将图像保存到 SD 卡并显示
我需要在另一个线程中完成每一步。看来,当我完成加载图像时,我需要将其转移到第二个线程中。
经过一番谷歌搜索后,我意识到我需要为每个线程实现 Callable 接口,然后将其与 ExecutorService 一起使用。问题是我不明白如何传递数据,例如,从第一个线程到第二个线程。
任何人都可以举一个简单的例子吗?谢谢
java - 为可调用类型线程分配优先级
我正在处理线程任务,该任务需要为可调用线程分配优先级。
这是我的代码。
在可调用线程中执行同步以在将来获得结果。在可运行线程中执行异步。
我也可以创建异步可调用线程;不是重点,所以我唯一的问题是如何ExecuterService
分配具有优先级的线程。
java - 使用callable传递两个参数并返回参数数组
我必须将两个字符串传递给一个线程,该线程将返回一个包含它们的数组,并且我必须使用可调用的。
这是我到目前为止所拥有的:
下面是主要内容:
问题出在main
:它说结果需要一个 String[] 但它正在获取一个对象。如果我转换结果,它会说必须声明一个异常被抛出。
java - 未在 callable.call 中关闭的 BufferedReader 会发生什么情况?
我有三个问题。
为了解释,我正在审查某人的代码,并注意到BufferedReader
s 有时没有被关闭。通常,Eclipse 会发出警告,指出这是一个潜在的内存泄漏(我修复了它)。但是,在 Callable 内部类中,没有警告。
编写代码的人都是经验丰富的 Java 开发人员,所以我的第一个想法是这是故意的……但可能是他们在编写代码时很着急而忽略了它。
我的问题是:
为什么 Eclipse 没有突出显示这一点(可以通过以下问题的答案来回答)?
如果它在 call() 方法中关闭,可能发生的最坏情况是什么?(我想不出一个很好的理由......我一直在寻找一段时间......但也许是故意不关闭 BufferedReader)
如果 BufferedReader没有在内部类中关闭,可能发生的最坏情况是什么?