[請益] 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