編輯:Android開發教程
有一道這樣的面試題:開啟一個子線程和主線程同時運行,子線程輸出10次後接著主線程輸出100次,如此反復50次。先看下面代碼:
package com.maso.test;
/**
*
* @author Administrator
* 兩個線程,其中是一個主線程,第一個線程先運行輸出10次,主線程接著運行輸出100次,如此反復50次
*/
public class ThreadTest3 implements Runnable{
private static Test test;
@Override
public void run() {
for(int i=0; i<50; i++){
test.f1(i);
}
}
public static void main(String[] args) {
test = new Test();
new Thread(new ThreadTest3()).start();
for(int i=0; i<50; i++){
test.f2(i);
}
}
/**
* 將控制和邏輯及數據分類(該類就是數據)
* @author Administrator
*
*/
static class Test{
private boolean isf1 = true;
/**
* 輸出10次
*/
public synchronized void f1(int j){
if(!isf1){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=1; i<=10; i++){
System.out.println(Thread.currentThread().getName() + "第" + j + "次輪巡,輸出" + i);
}
isf1 = false;
notify();
}
/**
* 輸出100次
*/
public synchronized void f2(int j){
if(isf1){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=1; i<=100; i++){
System.out.println(Thread.currentThread().getName() + "第" + j + "次輪巡,輸出" + i);
}
isf1 = true;
notify();
}
}
}
上面判斷用的是if語句,這樣做看似沒有什麼問題,實際上這樣做是不安全的,因為線程在等待的過程中有可能被假喚醒,所以我們需要使用while語句。另外在使用wait和notify的時候需要注意一下幾點:
1、調用object的wait方法和notity方法時,必須先獲得object的對象鎖(必須寫在synchronized中)。
2、如果調用了object的wait方法,則該線程就放掉了對象鎖。
3、如果A1、A2、A3都在object.wait(),則B調用object.notify()只能喚醒A1、A2、A3中的一個(具體哪一個由JVM決定)
4、object.notifyAll()能夠喚醒全部。
5、B在喚醒A的時候,B如果還持有對象鎖,則要等到B釋放鎖後,A才有機會執行。
 
Android UI設計與開發教程 引導界面(四)仿人人網V5.9.2最新版引導界面
這一篇我將會以人人網的引導界面為實例來展開詳細的講解,人人網的引導界面比較的新穎,不同於其他 應用程序千篇一律的靠滑動來引導用戶,而是以一個一個比較生動形象的動畫效果展
Android自定義View之仿QQ等級天數進度
最近一直都在看自定義View這一塊。差不多一個星期了吧。這個星期堅持每天更新博客,感覺自己的技術也有點突破,對自定義View的計算也有了更深的認識。今天坐地鐵玩手機的時候
Android LibGDX游戲引擎開發教程(四) 各個模塊的詳細介紹
博主思來想去,覺得還是想把這個教程寫的再細一點,讓讀者能夠更清楚的了解LibGDX這個游戲引擎整體 的架構,所以也就總結出了這樣一篇文章。一、模塊概述作為游戲開發人員,我
android數據存儲方式(二) Shared Preferences
android的數據存儲有四種方式:1.Shared Preferences主要用於存儲key-value對格式的 數據,是輕量級的存儲機制,輕到只能存儲基本數據類型。