計算機プログラミングI 第12回 2003年1月23日(木) インターフェース スレッド 最後に お知らせ クイズ 授業アンケート

Slides:



Advertisements
Similar presentations
山元進.  for 文  while 文  do ~ while 文  文のネスト  break 文  continue 文.
Advertisements

プログラミング実習 1 ・ 2 ク ラス 第 2 週目 担当教員 : 渡邊 直樹. 課題 2 ● 2 × 2型行列の固有値, 固有ベクトルを求め る EigMatrix.java というプログラムを作成せ よ。 ● 行列の各要素はコマンド・プロンプトから入力 ● 計算した結果もコマンド・プロンプトに表示.
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
マルチスレッド処理 (II) Multithreading
Applet 岡部 祐典 鈴木 敬幸.
アルゴリズムとデータ構造1 2005年7月8日
~手続き指向からオブジェクト指向へ(Ⅰ)~
アルゴリズムとデータ構造 2010年7月5日
プログラミング基礎I(再) 山元進.
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング基礎I(再) 山元進.
プログラミング基礎I(再) 山元進.
JAVA.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
プログラミング実習 1・2 クラス 第 1 週目 担当教員:  渡邊 直樹.
繰り返し プログラミング 第4回 繰り返し プログラミング第4回.
プログラミングIII演習 第1回目.
社会人学習講座 「Javaプログラミング概論」
第2章 Eclipseと簡単なオブジェクト 指向プログラミング
第20章 Flyweight ~同じものを共有して無駄をなくす~
インタフェース プログラミング 第14回 インタフェース プログラミング第14回.
オブジェクト指向入門.
計算機プログラミングI 第8回 2002年12月5日(木) メソッドとクラス (教科書6章) クイズ インスタンスメソッド インスタンス変数
CONCURRENT PROGRAMMING
RMI ソフトウェア特論 第6回 /
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
プログラミング言語入門 手続き型言語としてのJava
アルゴリズムとプログラミング (Algorithms and Programming)
第9章 例外処理,パッケージ 9.1 例外処理 9.2 ガーベッジコレクション.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
アルゴリズムとデータ構造1 2006年7月4日
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
アルゴリズムとプログラミング (Algorithms and Programming)
10-1 SAXの概要 10-2 Saxプログラミングの基礎 10-3 saxのプログラム例
計算機プログラミングI 第11回 再帰 再帰的なメソッド定義 帰納的定義 再帰的なデータ構造 計算機プログラミングI (増原) 2003年度.
Java8について 2014/03/07.
アルゴリズムとデータ構造 2010年6月21日
アルゴリズムとデータ構造 2010年7月26日
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
計算機プログラミングI 第5回 配列 文字列(Stringクラス) mainの引数 配列の利用例
計算機プログラミングI 第8回 素数を見つけるアルゴリズム 継承とインスタンスメソッド クラスの設計 オブジェクトに機能を加える
計算機プログラミングI 第12回 スレッド インターフェース 授業アンケート 計算機プログラミングI (増原) 2003年度.
オブジェクト プログラミング 第2回 プログラムの基本.
プログラムのコメント.
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
計算機プログラミングI 第3回 プリミティブ値 クラスメソッド クラス変数 式と演算 変数の利用
コレクション・フレームワーク J2EE I (データベース論) 第6回 /
アルゴリズムとデータ構造1 2009年7月2日
計算機プログラミングI 第4回 2002年10月31日(木) 問題解決とアルゴリズム クラスメソッドと手続きの抽象化 最大公約数
Chapter 5 5.5 thisキーワード 5.6 インスタンス変数とインスタンスメソッド 結城 隆
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

計算機プログラミングI 第12回 2003年1月23日(木) インターフェース スレッド 最後に お知らせ クイズ 授業アンケート 実験協力のお願い

インタフェースの目的 クラスの異なるオブジェクトを同じように扱いたい場合がある クラスの親子関係がある → 親クラスのオブジェクトとして扱える 親子関係がない → インタフェースを使う 燃料補給 名前をつける エサをやる 「特定のメソッドを持っている」 ことは時として クラスの親子関係と独立

インタフェースの目的 クラスの異なるオブジェクトを同じように扱いたい場合がある クラスの親子関係がある → 親クラスのオブジェクトとして扱える 親子関係がない → インタフェースを使う 飛んで 移動する 「特定のメソッドを持っている」 ことは時として クラスの親子関係と独立

インターフェース (復習) クラスの継承 インターフェース 親クラスにあるメソッドを子クラスは継承 → 子クラスも同じ名前のメソッドを全て持つ インターフェース クラスの親子関係とは別に 「同じ名前のメソッドを持っている」ことを宣言する仕組 同じ名前のメソッドを持っている → 同じように操作できる

インターフェースを使ったプログラム interface Drawable { void draw(int x,int y); } class DrawHouse extends House implements Drawable{ int s = 10; public void draw(int x, int y) { up(); moveTo(x, y, 0); down(); house(s); s+= 10; } インターフェースの宣言 クラスがインターフェースを実装していることの宣言 クラスがインターフェースを実装していることの宣言 interface Drawable { void draw(int x,int y); } class DrawText implements Drawable{ int s = 1; public void draw(int x, int y) { for(int i = 0; i < x / 10; i++){ System.out.print("*"); } for(int i = 0; i < y / 10; i++){ System.out.print("+"); System.out.println(""); インターフェースの使用 public class T81 { public static void main(String args[]){ TurtleFrame f = new TurtleFrame(); Drawable[] hm = new Drawable[3]; hm[0] = new DrawHouse(); … … while(true){ … hm[n].draw(x, y); }

インターフェースの働き interface Drawable { void draw(int x,int y); } class DrawHouse extends House implements Drawable{ int s = 10; public void draw(int x, int y) { up(); moveTo(x, y, 0); down(); house(s); s+= 10; } 宣言: drawという名前の メソッドがある クラスがインターフェースを実装していることの宣言 実装: クラスに drawという名前のメソッドが定義 interface Drawable { void draw(int x,int y); } class DrawText implements Drawable{ int s = 1; public void draw(int x, int y) { for(int i = 0; i < x / 10; i++){ System.out.print("*"); } for(int i = 0; i < y / 10; i++){ System.out.print("+"); System.out.println(""); 使用: 型として「drawという名前のメソッドがある」オブジェクトの配列 public class T81 { public static void main(String args[]){ TurtleFrame f = new TurtleFrame(); Drawable[] hm = new Drawable[3]; hm[0] = new DrawHouse(); … … while(true){ … hm[n].draw(x, y); }

インターフェース 宣言: 「特定の名前のメソッドを持っていること」に 名前をつける メソッドの中身は無い!!! 宣言: 「特定の名前のメソッドを持っていること」に 名前をつける メソッドの中身は無い!!! 実装: インターフェースが決めたメソッドを クラスが持っている 型としての使用: 値はそのインターフェースを 実装したクラスのオブジェクトである interface Drawable { void draw(int x,int y); } class DrawHouse extends House implements Drawable{ Drawable[] hm = new Drawable[3]; … hm[n].draw(x, y);

練習 (準備) 練習8.1 Drawable.java ― インターフェースの定義 Drawableを実装するクラスの定義 T81.java ― Drawableを使うクラス もしインターフェースがなかったら どこでエラーが出るか? 練習8.1

スレッド (復習) “java Sketch” のようにして、プログラムの実行を開始すると、Sketchクラスのmainメソッドの先頭、次の場所・・・のように順に処理が始まる。メソッド呼び出しがあれば、そのメソッドの先頭、次の場所・・・、最後の場所を処理し、メソッド呼び出しの次の場所から処理を続ける。 スレッド = この「場所」を順にたどるもの 「処理の流れ」 これまではスレッドは1つの実行につき1つだけ 実は複数作ることができる

スレッドが1つの プログラムの実行 Turtle ListDemo TurtleList public class ListDemo { public class Turtle{ boolean withKame = true; public static boolean withKameAll = true; public Color kameColor = Color.green; TurtlePanel f; // set by TurtlePanel double angle; // turtle current angle double x, y; // turtle current position double dx, dy; // dx = sin(angle), dy = -cos(angle) boolean penDown; // pen status (up or down) Color c = Color.black; // pen color int kameType = 0; int rx, ry; boolean rubber = false; int moveWait = 20; int rotateWait = 20; public Turtle(int x,int y, int ia) { this.x = ((double)x + 0.5); this.y = ((double)y + 0.5); setangle((double)ia *Math.PI/180.0); penDown = true; } public double kameScale = 0.4; public int kame[][] = kameFig; public int kameR[][] = kameRFig; public int kameL[][] = kameLFig; void kameDraw(Graphics g, int data[][]) { int ix = (int)x, iy = (int)y; g.setColor(kameColor); for (int i = 0; i < data.length; i++) { int px = 0, py = 0; for (int j = 0; j < data[i].length; j += 2) { int kx = data[i][j], ky = data[i][j+1]; int nx = (int)((kx*(-dy) + ky*(-dx)) * kameScale); int ny = (int)((kx*dx+ ky*(-dy)) * kameScale); if (j > 0) g.drawLine(ix + px, iy + py, ix + nx, iy + ny); px = nx; py = ny; g.setColor(c); g.fillOval(ix - 1, iy - 1, 2,2); void show(Graphics g) if (rubber) { g.drawLine(rx, ry, (int)x, (int)y); if (withKame && withKameAll) { switch ((kameType/2) % 4) { case 0: case 2: kameDraw(g, kame); break; case 1: public class ListDemo { public static void main(String[] args) { f.addButton("追加"); f.addButton("削除"); f.addButton("前進"); f.addButton("回転"); TurtleList l = null; while (true) { String command = f.getPressedButton(); if (command.equals("追加")) { int x = f.getClickedX("クリックして下さい"); int y = f.getClickedY(); Turtle m = new Turtle(x,y,0); f.add(m); m.fd(0); l = new TurtleList(m,l); } else if (command.equals("前進")) { l.forwardAll(10); } else if (command.equals("回転")) { Turtle.speedAll(Turtle.speedFast); l.turnAll(); Turtle.speedAll(Turtle.speedSlow); } else if (command.equals("削除")){ Turtle m = l.firstTurtle; m.kameColor = java.awt.Color.red; l = l.nextTurtles; } Turtle ListDemo public class TurtleList { public Turtle firstTurtle; public TurtleList nextTurtles; public TurtleList(Turtle f, TurtleList n) { firstTurtle = f; nextTurtles = n; } public void forwardAll(int s) { firstTurtle.fd(s); if (nextTurtles != null) { nextTurtles.forwardAll(s); public void turnAll() { firstTurtle.lt((int)(Math.random()*360)); nextTurtles.turnAll(); TurtleList

mのrunから処理を始める スレッドをそれぞれ作る スレッドを使ったプログラム import java.awt.Color; public class Multi91 extends House implements Runnable{ int n, s; Multi91(int x, int y, int a, int n, int s){ super(x, y, a); this.n = n; this.s = s; } public void run(){ polygon(n,s); import java.awt.Color; public class Multi91 extends House implements Runnable{ int n, s; Multi91(int x, int y, int a, int n, int s){ super(x, y, a); this.n = n; this.s = s; } public void run(){ polygon(n,s); public static void main(String[] args){ TurtleFrame f = new TurtleFrame(); Multi91 m = new Multi91(200,200,0, 10,50); f.add(m); Multi91 m1 = new Multi91(100,200,0, 5,50); f.add(m1); m1.setColor(new Color(255,0,0)); m1.speed(5); Thread t = new Thread(m); Thread t1 = new Thread(m1); t.start(); t1.start(); System.out.println("Main メソッドは終了する."); } mのrunから処理を始める スレッドをそれぞれ作る スレッドの処理を 開始させる

スレッドを使ったプログラム public class Multi91 extends House implements Runnable{ import java.awt.Color; public class Multi91 extends House implements Runnable{ int n, s; Multi91(int x, int y, int a, int n, int s){ super(x, y, a); this.n = n; this.s = s; } public void run(){ polygon(n,s); import java.awt.Color; public class Multi91 extends House implements Runnable{ int n, s; Multi91(int x, int y, int a, int n, int s){ super(x, y, a); this.n = n; this.s = s; } public void run(){ polygon(n,s); 最初のスレッドは mainから始まる public static void main(String[] args){ TurtleFrame f = new TurtleFrame(); Multi91 m = new Multi91(200,200,0, 10,50); f.add(m); Multi91 m1 = new Multi91(100,200,0, 5,50); f.add(m1); m1.setColor(new Color(255,0,0)); m1.speed(5); Thread t = new Thread(m); Thread t1 = new Thread(m1); t.start(); t1.start(); System.out.println("Main メソッドは終了する."); }

スレッドを使ったプログラム public class Multi91 extends House implements Runnable{ import java.awt.Color; public class Multi91 extends House implements Runnable{ int n, s; Multi91(int x, int y, int a, int n, int s){ super(x, y, a); this.n = n; this.s = s; } public void run(){ polygon(n,s); import java.awt.Color; public class Multi91 extends House implements Runnable{ int n, s; Multi91(int x, int y, int a, int n, int s){ super(x, y, a); this.n = n; this.s = s; } public void run(){ polygon(n,s); 同じメソッドを 複数のスレッドが 実行することも できる 新しいスレッドは 引数のオブジェクトの runメソッドから public static void main(String[] args){ TurtleFrame f = new TurtleFrame(); Multi91 m = new Multi91(200,200,0, 10,50); f.add(m); Multi91 m1 = new Multi91(100,200,0, 5,50); f.add(m1); m1.setColor(new Color(255,0,0)); m1.speed(5); Thread t = new Thread(m); Thread t1 = new Thread(m1); t.start(); t1.start(); System.out.println("Main メソッドは終了する."); } startは スレッドを動かし始める

スレッドを使ったプログラム public class Multi91 extends House implements Runnable{ import java.awt.Color; public class Multi91 extends House implements Runnable{ int n, s; Multi91(int x, int y, int a, int n, int s){ super(x, y, a); this.n = n; this.s = s; } public void run(){ polygon(n,s); スレッドが作られる 引数のオブジェクトの runメソッドが出発点になる interface Runnable { void run(); } public static void main(String[] args){ TurtleFrame f = new TurtleFrame(); Multi91 m = new Multi91(200,200,0, 10,50); f.add(m); Multi91 m1 = new Multi91(100,200,0, 5,50); f.add(m1); m1.setColor(new Color(255,0,0)); m1.speed(5); Thread t = new Thread(m); Thread t1 = new Thread(m1); t.start(); t1.start(); System.out.println("Main メソッドは終了する."); } runメソッドがあるクラスの オブジェクトであれば何でもよい → Runnableインターフェースを 実装したクラスの オブジェクトであればよい

練習 Multi91.java を動かしてみる タートルをもう1匹増やす 練習問題9.1 タートルの配列を作る(cf. T51.java) スレッドの配列を作る―スレッドのi番目は タートルのi番目を担当 スレッドのi番目をstart( ) ― run メソッドが i 番目を動かす (余力があれば) ― スレッドを使ってmorphing

マルチスレッドによるプログラム マルチスレッド = 複数のスレッド 利点 難点 別々の処理を別々にプログラムして 同時に実行できる 例: データを送っている間、アニメーションを表示 銀行ATMで複数の端末の操作を同時に処理 難点 複数のスレッドの同期 動きを合わせる・同じデータを操作する等々

マルチスレッドの問題の例 1つの口座に2つのスレッドが同時に預金した場合: スレッド1 預金(1000) 新しい残高=残高+預金高 預金高=新しい残高 class 銀行口座 { int 残高 = …; void 預金(int 預金高) { int 新しい残高 = 残高 + 預金高; 預金高 = 新しい残高; } スレッド2 預金(2000) 新しい残高=残高+預金高 預金高=新しい残高

マルチスレッドの処理 他のスレッドの実行が 終了するのを待つ t.join() 他のスレッドを一時停止、再開、強制終了 自分が動いている間は 他のスレッドを 実行させない お知らせを待つ ・ お知らせをする タートルで 家を描く タートルで 家を描く house house rt fd fd rt

練習 練習9.3 練習9.4 「2つのスレッドがsyncro()を呼び出すまで待ち、揃ったら実行を再開する」 Thread91.javaをそのまま実行 手順に従う ※ “synchorized修飾子をつける” public synchronized void polygon(int s, int n) { 意味: あるスレッドがこのオブジェクトのpolygonメソッドを実行している間は、他のスレッドは同じオブジェクトのpolygon(または別のsynchorized)メソッドを実行できない 練習9.4 「2つのスレッドがsyncro()を呼び出すまで待ち、揃ったら実行を再開する」 ※ try { 文; } catch (InterruptedException e) { } ** 「文」の中で「例外」が起きた場合、その例外を無視して**以下から実行を続ける。 「例外」 ― 突発的な事態が起きたときに、処理を中断する仕組

お知らせ 課題レポートの提出状況 ACM国際大学対抗プログラミングコンテスト webページで公開・電子メールで問合せ (ala 数学オリンピック) 対象:学部学生3名のチーム 日程(2002年度): 10月頃国内予選 @ web 11月頃アジア地区予選 @ 金沢など 3月頃世界大会 @ ハリウッド http://www.kitnet.jp/icpc/j/

クイズ 実験協力のお願い 授業アンケート