編輯: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才有機會執行。
 
這一篇我將會以人人網的引導界面為實例來展開詳細的講解,人人網的引導界面比較的新穎,不同於其他 應用程序千篇一律的靠滑動來引導用戶,而是以一個一個比較生動形象的動畫效果展
最近一直都在看自定義View這一塊。差不多一個星期了吧。這個星期堅持每天更新博客,感覺自己的技術也有點突破,對自定義View的計算也有了更深的認識。今天坐地鐵玩手機的時候
博主思來想去,覺得還是想把這個教程寫的再細一點,讓讀者能夠更清楚的了解LibGDX這個游戲引擎整體 的架構,所以也就總結出了這樣一篇文章。一、模塊概述作為游戲開發人員,我
android的數據存儲有四種方式:1.Shared Preferences主要用於存儲key-value對格式的 數據,是輕量級的存儲機制,輕到只能存儲基本數據類型。