[請益] java多執行緒runnable問題請教

看板Soft_Job (軟體人)作者 (cyntasha)時間1年前 (2023/03/09 06:15), 編輯推噓3(3022)
留言25則, 8人參與, 1年前最新討論串1/1
不好意思想請教一個作業問題,對大神來說應該不難,但我在一個地方卡住了。需要實現一個用戶輸入指令,然後運用多執行緒處理背後的運算,回傳用戶訊息。運算邏輯的部分老師已經寫好,不用管他怎麼計算的,用戶也不用真的輸入東西,用 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應該不需要再這樣寫才對,但又不會修改,因此上來詢問,感激不盡。 -- Sent from nPTT on my iPhone X -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 5.151.132.106 (英國) ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1678313742.A.DDF.html

03/09 08:31, 1年前 , 1F
再看一下SlowCalculator裡面的run?
03/09 08:31, 1F

03/09 08:48, 1年前 , 2F
你可以問問chat
03/09 08:48, 2F

03/09 09:56, 1年前 , 3F
這邊 new Runnable @Override run 是為了在 s.run 外面再包
03/09 09:56, 3F

03/09 09:59, 1年前 , 4F
別的動作一起跑,就是必要的,跟你的SlowCalculator是不是
03/09 09:59, 4F

03/09 09:59, 1年前 , 5F
Runnable沒什麼關係
03/09 09:59, 5F

03/09 10:00, 1年前 , 6F
要改頂多就是 new Runnable() 換成 new SlowCalculator(n)
03/09 10:00, 6F

03/09 10:00, 1年前 , 7F
SlowCalculator s = new SlowCalculator(n); 刪掉
03/09 10:00, 7F

03/09 10:00, 1年前 , 8F
s.run() 改成 super.run(),邏輯上沒什麼變化一樣是去包
03/09 10:00, 8F

03/09 10:01, 1年前 , 9F
SlowCalculator.run
03/09 10:01, 9F

03/09 10:08, 1年前 , 10F
這是Decorator pattern,跟thread、runnable沒什麼關係
03/09 10:08, 10F

03/09 10:13, 1年前 , 11F
如果你是想把整個pattern改掉,那就想想你要怎樣、在哪去動
03/09 10:13, 11F

03/09 10:13, 1年前 , 12F
results、runningCalculations
03/09 10:13, 12F

03/09 10:20, 1年前 , 13F
java也太難了
03/09 10:20, 13F

03/09 11:14, 1年前 , 14F
原PO可以想成用戶可以同時輸入多個指令(像是批次處理)
03/09 11:14, 14F

03/09 11:15, 1年前 , 15F
或多個用戶可以同時輸入指令,然後等待處理結果
03/09 11:15, 15F

03/09 11:17, 1年前 , 16F
處理過程可以交給別的thread處理,所以看起來會有2層
03/09 11:17, 16F

03/09 11:31, 1年前 , 17F
如果SlowCalculator有實作Runnable本身就是Runnable
03/09 11:31, 17F

03/09 11:32, 1年前 , 18F
如果是問Thread與Runnable的關係,舉例就是在外送平台
03/09 11:32, 18F

03/09 11:34, 1年前 , 19F
點餐(Runnable),但實際上要有人送(Thread)
03/09 11:34, 19F

03/09 11:35, 1年前 , 20F
要考慮執行序執行完才能 getResult()
03/09 11:35, 20F

03/09 11:36, 1年前 , 21F
能跑是因為new了Thread的,不是new Runnable
03/09 11:36, 21F

03/09 18:35, 1年前 , 22F
www.baeldung.com/java-asynchronous-programming
03/09 18:35, 22F

03/09 18:46, 1年前 , 23F
runnable是新增class thread是新增instance 不要搞錯了
03/09 18:46, 23F

03/10 08:47, 1年前 , 24F
非常感謝各位高手解惑 已在runCommand加上isalive判斷
03/10 08:47, 24F

03/10 08:47, 1年前 , 25F
寫出把new runnable跟void run拿掉感覺能跑的版本
03/10 08:47, 25F
文章代碼(AID): #1a2GaEtV (Soft_Job)
文章代碼(AID): #1a2GaEtV (Soft_Job)