csharp高级练习题:并发任务执行【难度:3级】:
实现一个Worker
类,它给出了一组任务(Java中的Runnable
接口的实现和C# 中的自定义Runnable
类)将同时执行它们并返回执行摘要,其中任务分类为成功,失败或时间到.
例如,以下输入:
actions = [Task3(3s后抛出),Task4(4s后的compl.),Task2(2s后的compl.),Task1(1s后抛出)],timeout = 8s
应该在** 4 ** 秒后返回以下结果:
result.successful = [Task2,Task4]
result.failed =(Task3,Task1)
result.timedOut =()
以下输入:
actions = [Task3(3s后抛出),Task5(挂起),Task4(4s后的compl.),Task2(2s后的compl.),Task1(1s后的compl.),timeout = 8s
8秒后应返回以下结果:
result.successful = [Task1,Task2,Task4]
result.failed =(Task3)
result.timedOut =(Task5)
要求:
- 您需要在作为参数给出超时之前执行任务,以及在CodeWars超出测试运行之前执行任务.目前,CodeWars的Java超时为16秒,C# 为12秒.所有任务的集体持续时间肯定会超过超时,因此您无法一个接一个地迭代执行任务.
- 将执行25到60个任务之间的任务.
- 某些任务将工作一段时间然后完成.其他将失败,其
run
方法将抛出一个未指定的异常.任务挂起并且不会在短时间内返回也可能发生. Worker需要将每个传递的任务分类为成功,失败或超时,并将它们添加到返回的ExecutedTasks
实例的相应集合中. - 成功的任务* 必须* 按其持续时间的顺序返回.保证当所有任务同时开始时,每个成功的任务将在某个不同的时间点结束,并且不应该有两个任务在同一时刻完成(对于"同一时刻"的某些定义,请参阅note 下面).失败或超时任务的顺序并不重要.
- 当发生没有挂起任务时,方法应该在不长于最长运行任务的持续时间的时间之后返回.例如,当执行时间最长的任务需要3秒钟时,方法应在3秒后返回+ 可能需要一些小的额外时间(但请参见下面的** 注释**).
- 禁止这个kata在Java中使用繁忙的循环和
Thread.sleep
方法,在C# 中使用Thread.Sleep
,因为所有的等待和块都应该用适当的方法和超时来实现.测试会做一些努力来快速检测旋转延迟循环,并且将扫描解决方案文件以查找短语**“sleep"或"Sleep”** 的所有出现,并且在找到任何短语时将被拒绝.这是一个文本搜索,因此短语不能作为您定义的变量或方法的名称出现,也不能出现在评论中(对不起!).它并不完美,因为它仍然允许其他不正确的延迟实现,这是我无法防范的,但请确保当你使用其中任何一个时,Threading Fairy会让你直接进入你的关键部分.
它保证:
- 除非挂起,否则每个任务执行的超时时间都会少于预期.当它挂起时,它会挂起几分钟*,绝对不会在任何短时间内完成.您可以放心地假设,如果任务的执行超过了提供的超时,它就会挂起.
- 作为参数给出的时间限制将始终显着小于CodeWars平台的超时.
- 超时任务发生了什么并不重要.你可以杀死它们,你可以让它们继续运行.你不需要对它们采取任何特定的行动,但如果你这样做,它不会伤害任何人.只是不要崩溃他们:)
- 任务大多是空闲和模拟阻塞操作(等待用户输入,I / O操作等),因此他们宁愿不会妨碍其他任务并阻止其执行.他们不会竞争任何类型的公共资源,包括CPU.
- 引用
Runnable
对象作为输入集合点传递给唯一对象,并且没有重复项.
解决方案设置中提供了Worker
类的框架:
公共类工人{
public static class ExecutedTasks {
public final List successful = new ArrayList <>();
public