[请益] java多执行绪runnable问题请教

楼主: cyntasha (cyntasha)   2023-03-09 06:15:39
不好意思想请教一个作业问题,对大神来说应该不难,但我在一个地方卡住了。需要实现一个用户输入指令,然后运用多执行绪处理背后的运算,回传用户讯息。运算逻辑的部分老师已经写好,不用管他怎么计算的,用户也不用真的输入东西,用 System.out.println的方式呈现就好, 比如说System.out.println(solution.runCommand("start 10456060"));我需要印出Started 10456060,程式码以及打印结果连结如下,Solution那个类是新加的,功能有实现出来。
https://scalloped-ceres-c7b.notion.site/Thread-a7f5586100724fe2b18ef8d0b6e707ad
我的问题是
private void startCalculation(long n) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
SlowCalculator s = new SlowCalculator(n);
try {
// s.run();
results.put(n, s.getResult());
} finally {
runningCalculations.remove(n);
}
}
});
runningCalculations.put(n, t);
t.start();
}
这个方法,又另外new了一个Runnable(),他才能跑,但在SlowCalculator类里已经引用Runnable应该不需要再这样写才对,但又不会修改,因此上来询问,感激不尽。
作者: foreverk (文艺青年)   2023-03-09 08:31:00
再看一下SlowCalculator里面的run?
作者: a12838910 (Ziv.C)   2023-03-09 08:48:00
你可以问问chat
作者: ssccg (23)   2023-03-09 09:56:00
这边 new Runnable @Override run 是为了在 s.run 外面再包别的动作一起跑,就是必要的,跟你的SlowCalculator是不是Runnable没什么关系要改顶多就是 new Runnable() 换成 new SlowCalculator(n)SlowCalculator s = new SlowCalculator(n); 删掉s.run() 改成 super.run(),逻辑上没什么变化一样是去包SlowCalculator.run这是Decorator pattern,跟thread、runnable没什么关系如果你是想把整个pattern改掉,那就想想你要怎样、在哪去动results、runningCalculations
作者: MoonCode (MoonCode)   2023-03-09 10:20:00
java也太难了
作者: OriginStar   2023-03-09 11:14:00
原PO可以想成用户可以同时输入多个指令(像是批次处理)或多个用户可以同时输入指令,然后等待处理结果处理过程可以交给别的thread处理,所以看起来会有2层
作者: dnzteeqrq (大只猫)   2023-03-09 11:31:00
如果SlowCalculator有实作Runnable本身就是Runnable
作者: OriginStar   2023-03-09 11:32:00
如果是问Thread与Runnable的关系,举例就是在外送平台点餐(Runnable),但实际上要有人送(Thread)
作者: dnzteeqrq (大只猫)   2023-03-09 11:35:00
要考虑执行序执行完才能 getResult()
作者: OriginStar   2023-03-09 11:36:00
能跑是因为new了Thread的,不是new Runnable
作者: alan3100 (BOSS)   2023-03-09 18:35:00
www.baeldung.com/java-asynchronous-programmingrunnable是新增class thread是新增instance 不要搞错了
楼主: cyntasha (cyntasha)   2023-03-10 08:47:00
非常感谢各位高手解惑 已在runCommand加上isalive判断写出把new runnable跟void run拿掉感觉能跑的版本

Links booklink

Contact Us: admin [ a t ] ucptt.com