[問題] thread run VS start
之前寫的程式不斷出錯,上網查才大略知道thread 的run和start差異
在網路上看到的講義,
講義裡做出label(圖片)移動的方式是用thread.start();
但當我將thread放在method裡頭時,例如:
static void voidTestInVoid(){
System.out.println("voidTestInVoid beginning");
thread = new addThread1("abc"); //print出abc
thread.start();
thread = new addThread1("cde");
thread.start();
System.out.println("voidTestInVoid end");
}
我發現在執行 voidTestInVoid(); 時
每次執行print出來的文字順序都會不一樣,特別是不會從上而下照順序執行
根據google上查詢的結果,
有人提及若是要讓他們照順序執行,得改用thread.run();
但在此出現一個問題,當我模仿java教學講義上的程式碼
不用thread.start();改用thread.run()去讓label不斷重新設定座標
達到讓label(圖片)看起來像是在動的感覺
例如: (下面節錄一部份程式碼
完整在: http://tung.tsu.edu.tw/lecture/java/txt/Ch08/J8_6_1.txt
class movePic implements Runnable {
private JLabel lblPic;
public void run() {
int pos_x = 0;
while (true) {
pos_x += 2;
lblPic.setLocation(pos_x, pos_y);
Pause(time);
if (pos_x >= wide) pos_x = 0;
}
}
Thread movePic1 = new Thread(new movePic(lbl1, w1, y1, time1));
movePic1.start(); //我將start改為run
我模仿講義將自己寫的程式其中的thread.start()改為thread.run()
然而,程式開始跑後,
圖片(JLabel)不會隨著座標的改變與 setLocation 在JPanel上畫出
中間的移動過程,
(原本用start()這個方法 確定有做出來讓JLabel在螢幕上不斷變換位置,
產生移動的視覺效果,但改成run()就不行了)
即便是加入repaint()或是JPanel名稱.repaint() 也都沒有作用
但我又怕用thread.start();會讓整個程式在跑時會亂跳
(不會從上往下依序執行)
於是
在此想請教有什麼解決之道,能夠使程式乖乖從上往下一行行執行
同時也能讓不斷setLacation的JLabel在螢幕上產生移動的效果
或是我該改用其他方式讓圖片看起來像是在移動? (目前只讀到過用thread
不好意思打擾了,新手求給個方向,感謝<_ _>
ps:我用的也是 try { Thread.sleep(pause_time); }
catch(InterruptedException e) {}
讓JLabel每隔幾毫秒便setLocation一次
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 36.224.207.186
爬了一些文章,在想該不會是我把thread寫在listener的method裡
導致label只顯示最後一次的狀態?
但run()不行 start()就行? (搞混了
※ 編輯: togs 來自: 36.224.207.186 (11/19 04:39)
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):