進階應用程式設計 2014/12/07
TRANSCRIPT
進階程式設計⺩王哲輝
關於我
Hi, I’m Samael
Pr. Engineer, Connected Services, HTC Creative Labs
Previous
課程規劃
⼀一個⺫⽬目標
兩個主題
三個週次
⺫⽬目標
⺫⽬目標
沒有⼈人睡著
⺫⽬目標
沒有⼈人睡著
⺫⽬目標對 Java ⾏行動裝置程式設計
⺫⽬目標對 Java ⾏行動裝置程式設計
略懂~略懂~
主題
Java 物件與執⾏行緒
Android 基本概念
主題
Java 物件與執⾏行緒
Android 基本概念這部份⽤用 C/C++ 解釋
週次W1: Java 物件與執⾏行序
W2: Android 基本概念
W3: Android (續) + 專案展⽰示(暫定)
範例程式
https://github.com/freesamael/npu-java-course-2014-fall
學 Java 到底可以幹嘛?
藍鑽級 程式 設計師
藍鑽級 程式 設計師
Java 平台
Java EE Java SE Java ME
Android
Java EE
Java EE很夯的雲端
Java EE很夯的雲端
https://www.youtube.com/watch?v=vxf1skKXwM0
千⾔言萬語不如看廣告
Java SE
Java SE
Java
Java ME
Java ME
Series 40
Java ME⼀一代霸主
Series 40
Java ME⼀一代霸主
過氣英雄Series 40
Java ME
東⼭山 再起
Java ME
東⼭山 再起進廣告
https://www.youtube.com/watch?v=Kt5VulFqBm4
Android
Android
“Java 是⼀一種 物件導向程式語⾔言”
什麼是物件?
將真實世界的物件對應到程式語⾔言
典型 範例
以 C 實作資料結構#define FF (0)#define FR (1)#define RR (2)
struct Porche911 {int cost;int top_speed;double time_0_62;double braking_distance;double cornering;int layout;double speed;double position;
};
初始化
void init911(struct Porche911 *p911) {p911->cost = 172700;p911->top_speed = 311;p911->time_0_62 = 4.0;p911->braking_distance = 30.2;p911->cornering = 0.99;p911->layout = RR;
p911->speed = 0.0;p911->position = 0.0;
}
油⾨門 / 煞⾞車
void accelerate(struct Porche911 *p911, double depth, double duration) {
p911->speed = ...p911->position = ...
}
void brake(struct Porche911 *p911, double depth, double duration) {
p911->speed = ...p911->position = ...
}
C++ 的作法class Porche911 {public:
Porche911();void accelerate(double depth, double duration);void brake(double depth, double duration);
private:int cost;int top_speed;double time_0_62;double braking_distance;double cornering;int layout;double speed;double position;
};
流程⽐比較
int main(int argc, char *argv[]) {struct Porche911 my911;init911(&my911);accelerate(&my911, 0.8, 1.2);brake(&my911, 0.3, 0.5);return 0;
}
int main(int argc, char *argv[]) {Porche911 my911;my911.accelerate(0.8, 1.2);my911.brake(0.3, 0.5);return 0;
}
Object = data + code
Object = data + code
也就是封裝
什麼是 物件導向?
封裝、 繼承、多型
繼承
Generalization
Specialization
A Sedan is-a Vehicle A SUV is-a Vehicle A MPV is-a Vehicle
class Point2d {public:
int x;int y;
};
class Point3d : public Point2d {public:
int z;};
Q1 - 輸出?#include <cstdio>int main(int argc, char *argv[]) {
Point2d p2d;p2d.x = 100;p2d.y = 50;printf("Point2d: x=%d, y=%d\n", p2d.x, p2d.y);
Point3d p3d;p3d.x = 100;p3d.y = 50;p3d.z = 75;printf("Point3d: x=%d, y=%d, z=%d\n", p3d.x, p3d.y, p3d.z);
Point2d *p2dp = &p3d;p2dp->x = 50;p2dp->y = 100;printf("pointer of Point3d as Point2d: x=%d, y=%d\n",
p2dp->x, p2dp->y);
return 0;}
Q2 - 以 C 語⾔言改寫
class Point2d {public:
int x;int y;
};
class Point3d : public Point2d {public:
int z;};
struct Point2d {int x;int y;
};
struct Point3d {struct Point2d base;int z;
};
Q3 - 輸出?#include <stdio.h>int main(int argc, char *argv[]) {
struct Point2d p2d;p2d.x = 100;p2d.y = 50;printf("Point2d: x=%d, y=%d\n", p2d.x, p2d.y);
struct Point3d p3d;p3d.base.x = 100;p3d.base.y = 50;p3d.z = 75;printf("Point3d: x=%d, y=%d, z=%d\n", p3d.base.x, p3d.base.y, p3d.z);
struct Point2d *p2dp = (struct Point2d *)&p3d;p2dp->x = 50;p2dp->y = 100;printf("pointer of Point3d as Point2d: x=%d, y=%d\n",
p2dp->x, p2dp->y);
return 0;}
多型
class Engineer {const char *title;
public:Engineer(): title("Engineer") {}const char* getTitle() {
return title;}
};
class SrEngineer : public Engineer {const char *title;
public:SrEngineer(): title("Sr. Engineer") {}const char* getTitle() {
return title;}
};
class PrEngineer : public Engineer {const char *title;
public:PrEngineer(): title("Pr. Engineer") {}const char* getTitle() {
return title;}
};
Q4 - 輸出?
#include <cstdio>int main(int argc, char *argv[]) {
Engineer eng;printf("%s\n", eng.getTitle());SrEngineer sr;printf("%s\n", sr.getTitle());PrEngineer pr;printf("%s\n", pr.getTitle());
return 0;}
Q5 - 輸出?#include <cstdio>int main(int argc, char *argv[]) {
Engineer eng;SrEngineer sr;PrEngineer pr;
Engineer *engp = ŋprintf("%s\n", engp->getTitle());engp = &sr;printf("%s\n", engp->getTitle());engp = ≺printf("%s\n", engp->getTitle());
return 0;}
class Engineer {const char *title;
public:Engineer(): title("Engineer") {}virtual const char* getTitle() {
return title;}
};
class SrEngineer : public Engineer {const char *title;
public:SrEngineer(): title("Sr. Engineer") {}const char* getTitle() {
return title;}
};
class PrEngineer : public Engineer {const char *title;
public:PrEngineer(): title("Pr. Engineer") {}const char* getTitle() {
return title;}
};
Q6 - 輸出?#include <cstdio>int main(int argc, char *argv[]) {
Engineer eng;SrEngineer sr;PrEngineer pr;
Engineer *engp = ŋprintf("%s\n", engp->getTitle());engp = &sr;printf("%s\n", engp->getTitle());engp = ≺printf("%s\n", engp->getTitle());
return 0;}
Q7 - 以 C 語⾔言改寫class Engineer {
const char *title;public:
Engineer(): title("Engineer") {}const char* getTitle() {
return title;}
};
#include <cstdio>int main(int argc, char *argv[]) {
Engineer eng;printf("%s\n", eng.getTitle());
return 0;}
struct Engineer {const char *title;
};
void Engineer_init(struct Engineer *this) {this->title = "Engineer";
}
const char* Engineer_getTitle(struct Engineer *this) {return this->title;
}
#include <stdio.h>int main(int argc, char *argv[]) {
struct Engineer eng;Engineer_init(&eng);printf("%s\n", Engineer_getTitle(&eng));
return 0;}
這個也可以⽤用 C 語⾔言改寫嗎?class Engineer {
const char *title;public:
Engineer(): title("Engineer") {}virtual const char* getTitle() {
return title;}
};
#include <cstdio>int main(int argc, char *argv[]) {
Engineer eng;printf("%s\n", eng.getTitle());
return 0;}
中場休息 Q&A
Java 執⾏行緒
WHY?
GUI 範例
Start a Thread #1
public class HelloRunnable implements Runnable {
public void run() { System.out.println("Hello from a thread!"); }
public static void main(String args[]) { (new Thread(new HelloRunnable())).start(); }
}
Start a Thread #2
public class HelloThread extends Thread {
public void run() { System.out.println("Hello from a thread!"); }
public static void main(String args[]) { Thread t = new HelloThread(); t.start(); }
}
Sleeppublic class HelloThread extends Thread {
public void run() { try { Thread.sleep(4000); } catch (InterruptedException e) {} System.out.println("Hello from a thread!"); }
public static void main(String args[]) { Thread t = new HelloThread(); t.start(); }
}
Joinpublic class HelloThread extends Thread {
public void run() { System.out.println("Hello from a thread!"); }
public static void main(String args[]) { Thread t = new HelloThread(); t.start(); try { t.join(); } catch (InterruptedException e) {} }
}
回顧 GUI 範例
Q8 - 輸出?
public class Counter { private int c = 0;
public void increment() { c++; }
public void decrement() { c--; }
public int value() { return c; }}
public static void main(String args[]) {final Counter c = new Counter();
Thread t1 = new Thread() {public void run() {
for (int i = 0; i < 50000; i++) c.increment();}
};
Thread t2 = new Thread() {public void run() { for (int i = 0; i < 50000; i++)
c.decrement();}
};
t1.start();t2.start();try {
t1.join();t2.join();
} catch (InterruptedException e) {}
System.out.println("value=" + c.value());}
臨界區段 (Critical Section)
Critical Section 要件
• Mutual Exclusion:不允許兩個以上的執⾏行緒同時在對應的 critical section 中執⾏行。
• Progress:若沒有執⾏行緒在對應的 critical section 中執⾏行,則控制的機制不能阻擋請求進⼊入 critical section 之執⾏行緒進⼊入critical section。
• Bounded Waiting:控制機制必須使等待進⼊入 critical section 之執⾏行緒在有限時間內得以進⼊入。
三種做法
• Semaphore
• Mutex (= binary semaphore)
• Monitor
• Message Passing
三種做法
• Semaphore
• Mutex (= binary semaphore)
• Monitor
• Message Passing
全部講下去就要花三週了...
Synchronizationpublic class SynchronizedCounter { private int c = 0;
public synchronized void increment() { c++; }
public synchronized void decrement() { c--; }
public synchronized int value() { return c; }}
Q9 - does it work?public class SynchronizedCounter { private int c = 0;
public synchronized void increment() { c+=2; decrement(); }
public synchronized void decrement() { c--; }
public synchronized int value() { return c; }}
Reentrant Synchronization
⼀一個執⾏行緒不能 acquire 其他執⾏行緒正在使⽤用的 lock,但是可以重複 acquire 已經取得的 lock。
Reentrant Synchronization
⼀一個執⾏行緒不能 acquire 其他執⾏行緒正在使⽤用的 lock,但是可以重複 acquire 已經取得的 lock。
換個說法:已經進⼊入 critical section 內的執⾏行緒可以持續執⾏行相同 critical section 的功能。
Deadlock static class Friend { private final String name; public Friend(String name) { this.name = name; } public String getName() { return this.name; } public synchronized void bow(Friend bower) { System.out.format("%s: %s" + " has bowed to me!%n", this.name, bower.getName()); bower.bowBack(this); } public synchronized void bowBack(Friend bower) { System.out.format("%s: %s" + " has bowed back to me!%n", this.name, bower.getName()); } }
Deadlock
public static void main(String[] args) { final Friend alphonse = new Friend("Alphonse"); final Friend gaston = new Friend("Gaston"); new Thread(new Runnable() { public void run() { alphonse.bow(gaston); } }).start(); new Thread(new Runnable() { public void run() { gaston.bow(alphonse); } }).start(); }
Java Monitor(Optional)
Producer Consumer Problem
(Optional)
作業撰寫⼀一 Java 程式,由命令列輸⼊入兩個 4x4 矩陣 A、B, 以 4 個背景執⾏行緒平均執⾏行 A x B 矩陣相乘之運算,
從命令列印出運算結果。
Deadline: 12/20
參考此網站驗證結果 http://www.bluebit.gr/matrix-calculator/
matrix_multiplication.aspx