根據一個筆試題引出的思考
題目:頁面上現有ProgressBar控制元件progressBar,請用書寫執行緒以10秒的的時間完成其進度顯示工作
佈局檔案和簡單 就是一個Progressbar
Activity的程式碼如下(其實我一直不知道改把activity叫什麼好 視窗?或者活動?)
public class ProgressTest extends Activity {
private ProgressBar prs1;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.progressbar);
prs1 = (ProgressBar) findViewById(R.id.progressBar1);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
int progressBarMax =prs1.getMax();
while(prs1.getProgress()!=progressBarMax){
int progressBarnew=progressBarMax/10;
prs1.setProgress(prs1.getProgress()+progressBarnew);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//註釋的程式碼可以讓他一直跑
/*if((prs1.getProgress()+progressBarnew)==progressBarMax){
prs1.setProgress(progressBarnew);
}*/
}
}
})
;
thread.start();
}
}
這是第一種方式 在oncreat方法中新啟一個執行緒來給進度條加進度
講道理 這是在子執行緒中更新ui吧。
那我們就來看另一種方法
public class ProgressTest extends Activity {
private ProgressBar prs1;
private Handler handler = new Handler();
private Runnable myRunnable = new Runnable() {
public void run() {
handler.postDelayed(this, 1000);
int progressBarMax = prs1.getMax();
if (prs1.getProgress() <= progressBarMax) {
int progressBarnew = progressBarMax / 10;
prs1.setProgress(prs1.getProgress() + progressBarnew);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.progressbar);
prs1 = (ProgressBar) findViewById(R.id.progressBar1);
handler.post(myRunnable);
}
}
這是另一種方法 post(runnable)與handler繫結的執行緒上執行,不需要另外新建執行緒。
看post原始碼
public final boolean post(Runnable r)
{
return sendMessageDelayed(getPostMessage(r), 0);
}
其實也是sendMessage方法的一種 。。。
講道理還是sendmessage。。。
利用Timer類和Timertask來實現
public class ProgressTest extends Activity {
private ProgressBar prs1;
Timer time = new Timer();
Button btn1;
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == 1) {
int progressmax = prs1.getMax();
if (prs1.getProgress() != progressmax) {
int progressnew = progressmax / 10;
prs1.setProgress(prs1.getProgress() + progressnew);
}
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.progressbar);
prs1 = (ProgressBar) findViewById(R.id.progressBar1);
time.schedule(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
}
}, 0, 1000);
}
}
TimerTask的run方法並不是多執行緒的run方法,雖然實現了Runnable,但是僅僅是為了表示它是可執行的,並不代表它必須通過執行緒的方式來執行的。
Timer和TimerTask的簡單組合是多執行緒的嘛?不是,一個Timer內部包裝了“一個Thread”和“一個Task”佇列,這個佇列按照一定的方式將任務排隊處理,包含的執行緒在Timer的構造方法呼叫時被啟動,這個Thread的run方法無限迴圈這個Task佇列,若佇列為空且沒發生cancel操作,此時會一直等待,如果等待完成後,佇列還是為空,則認為發生了cancel從而跳出死迴圈,結束任務;迴圈中如果發現任務需要執行的時間小於系統時間,則需要執行,那麼根據任務的時間片從新計算下次執行時間,若時間片為0代表只執行一次,則直接移除佇列即可。
但是是否能實現多執行緒呢?可以,任何東西是否是多執行緒完全看個人意願,多個Timer自然就是多執行緒的,每個Timer都有自己的執行緒處理邏輯,當然Timer從這裡來看並不是很適合很多工在短時間內的快速排程,至少不是很適合同一個timer上掛很多工,在多執行緒的領域中我們更多是使用多執行緒中的:
Executors.newScheduledThreadPool
來完成對排程佇列中的執行緒池的處理,內部通過new ScheduledThreadPoolExecutor來建立執行緒池的Executor的建立,當然也可以呼叫:
Executors.unconfigurableScheduledExecutorService
方法來建立一個DelegatedScheduledExecutorService其實這個類就是包裝了下下scheduleExecutor,也就是這只是一個殼,英文理解就是被委派的意思,被託管的意思。
相關文章
- 記一個面試題引發的思考面試題
- 由哪個log先輸出引出的event loop思考OOP
- 陣列去重Demo引出的思考陣列
- 最近思考的一個問題
- 思考一個問題
- 根據題庫設定刷題程式
- 根據業務摸索出的一個selenium程式碼模版(python)Python
- 一道面試題引起的思考面試題
- 物件陣列 根據key 把一樣的push到一個陣列物件陣列
- 可能找到了財富密碼?Voodoo新作《Tower Run》引出的題材思考密碼Odoo
- PHP 如何根據鍵值刪除一個陣列中的元素PHP陣列
- 分享一個session過期後根據guard跳轉的實現Session
- 一道setTimeout async promise執行順序的筆試題引發的思考Promise筆試
- 一道面試題引發的思考面試題
- Python 根據id生成唯一碼Python
- 一個前端崗位電話面試所帶來的問題的思考前端面試
- 【GO語言學習】每日一題:根據身高重建佇列Go每日一題佇列
- 一個根據資料庫自動生成model類的擴充套件資料庫套件
- Flutter 使用GridView寫一個根據child數量自動增加的GridListFlutterView
- 【筆試題】用 PHP 寫一個微波爐筆試PHP
- excel將一個工作表根據條件拆分成多個工作簿Excel
- JAVA面試題筆試題-查詢一個字串不重複最長的串(個人方法)Java面試題筆試字串
- [轉帖]一個NAT問題引起的思考
- 手把手教你根據PromiseA+手寫一個Promise類Promise
- mysql 刪表引出的問題MySql
- 根據Taipei-Torrent修改出的三個bt工具AI
- Java : List中 根據map的某個key去重Java
- 根據提示操作
- 一個關於月球車的筆試題--求討論筆試
- 一次筆試引發的關於setTimeout的this的思考筆試
- Angular 如何根據一個 class 的定義和資料,動態建立一個該類的例項Angular
- python安裝MySQL庫引出的一些問題PythonMySql
- 從閉包引出來的一系列問題
- SAP RETAIL 如何根據分配表查到根據它建立的採購訂單?AI
- 一道賦值面試題引發的思考賦值面試題
- 論一道面試題引起的思考(總結)面試題
- java 實現根據年月得到這個月的日曆Java
- 訊飛有一個可以根據描述文字自動生成PPT的AI介面,有趣AI
- RocketMQ 很慢?引出了一個未解之謎MQ