例外(exception)とは何か

Similar documents
ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

参考 - メインスレッドは JVM によって自動的に起動されるため 起動するコードを書く必要 はありません 今まで例題 演習で作成してきたプログラムは全てメインメソッドにて 動作している シングルスレッドです マルチスレッドマルチスレッドとは名前のとおり複数のスレッドと言う意味です マルチスレッドは

問題1 以下に示すプログラムは、次の処理をするプログラムである

ガイダンス

Microsoft PowerPoint ppt

PowerPoint プレゼンテーション

ガイダンス

Thread

ガイダンス

PowerPoint プレゼンテーション

ガイダンス

< F2D B838A835882CC8CF68EAE2E6A7464>

Programming-C-9.key

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

JavaプログラミングⅠ

ガイダンス

text_10.dvi

226

< F2D825282CC947B909482CC A815B83682E6A>

基本情報STEP UP演習Java対策

< F2D834F838C A815B A CC>

9.3 同期 共有データへの読み書きの同期 複数のスレッドから共有データを読み書きするときに発生する問題について 一つのフィールドに対して複数のスレッドが同時にアクセスする可能性がある場合 その順番によっては整合性が保てなくなる可能性があるので スレッドの制御フローが独立していては困ることがある 次

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

問題1 以下に示すプログラムは、次の処理をするプログラムである

6 p.1 6 Java GUI GUI paintcomponent GUI mouseclicked, keypressed, actionperformed mouseclicked paintcomponent thread, 1 GUI 6.0.2, mutlithread C

< F2D82B682E182F182AF82F12E6A7464>


(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

PowerPoint プレゼンテーション

メディプロ1 Javaプログラミング補足資料.ppt

Javaの作成の前に

2016 年度 JAVA 講座第六週目 目次 パッケージ... 2 パッケージの作成... 2 パッケージの使用方法... 3 異なるパッケージ同名クラスの宣言... 4 パッケージの側面から見たアクセス修飾子... 4 ラッパークラス... 5 ラッパークラス利用法:キャスト... 5 ラッパーク

JavaプログラミングⅠ

< F2D82518CC282CC D2E6A7464>

Prog1_10th

Microsoft PowerPoint - prog03.ppt

< F2D92DE82E8914B82CC977088D32E6A7464>

Java言語 第1回

< F2D F B834E2E6A7464>

JAVA入門

2

シミュレーションの簡単な例 GUI 無しのシミュレーションを作る GUI を作る パラメタを設定するデモンストレーションをする 2 オブジェクト指向プログラミング特論

Prog2_9th

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

I HTML HashMap (i) (ii) :.java import java.net.*; import java.io.*; import java.util.hashmap; public class SimpleStopWatch { public static voi

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

** 平成 16 年度 FE 午後問題 Java** 示現塾プロジェクトマネージャ テクニカルエンジニア ( ネットワーク ) など各種セミナーを開催中!! 開催日 受講料 カリキュラム等 詳しくは 今すぐアクセス!! 平成 16

プログラミング基礎I(再)

2

2

Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

JavaプログラミングⅠ

IT プロジェクト

< F2D8EA CE909482CC92EA82852E6A7464>

Javaプログラムの実行手順

問 次の Fortran プログラムの説明及びプログラムを読んで、設問に答えよ。

Microsoft PowerPoint - prog09.ppt

Java知識テスト問題

JavaプログラミングⅠ

PowerPoint Presentation

プログラミング入門1

Microsoft PowerPoint - prog09.ppt

2

Java講座

GEC-Java

JavaプログラミングⅠ

PowerPoint プレゼンテーション

Javaセキュアコーディングセミナー東京 第3回 入出力(File, Stream)と例外時の動作 演習解説

解答上の注意 1 解答は 解答 紙の問題番号に対応した解答欄にマークしなさい 2 選択肢は 問ごとに 意されています 問 1の選択肢は 問 2で使 しません 3 選択肢は量が多いため 探しやすさの観点よりグループ分けされています グループ分けに合わせて解答欄が区切られていますが 横 1 列で問題 1

目 次 Java GUI 3 1 概要 クラス構成 ソースコード例 課題...7 i

Microsoft PowerPoint - chap10_OOP.ppt

JAVA とテンプレート

11 ソフトウェア工学 Software Engineering デザインパターン DESIGN PATTERNS デザインパターンとは? デザインパターン 過去のソフトウェア設計者が生み出したオブジェクト指向設計に関して, ノウハウを蓄積し 名前をつけ 再利用しやすいようにカタログ化したもの 各デ

Microsoft PowerPoint - netprog_2015_07.ppt [互換モード]

プログラミング入門1

実行時のメモリ構造\(2\) Javaスタック内のフレーム間動作

教材ドットコムオリジナル教材 0から始めるiアフ リ リファレンス i アプリ簡易リファレンス ver i アプリ Java 独自のメソッド (1)iアプリの命令を使えるようにする import com.nttdocomo.ui.*; (2) 乱数を使う import java.u

Java プログラミング Ⅰ 3 回目変 数 今日の講義講義で学ぶ内容 変数とは 変数の使い方 キーボード入力の仕方 変 数 変 数 一時的に値を記憶させておく機能 変数は 型 ( データ型 ) と識別子をもちます 2 型 ( データ型 ) 変数に記憶する値の種類変数の型は 記憶できる値の種類と範囲

GEC-Java

Microsoft PowerPoint - OOP.pptx

10/31 Java AWTの基本構造(Frameクラスの継承) 演習課題資料

ALG ppt

ÿþ˜u#u·0¹0Æ0à0

I. (i) Java? (A). 2Apples (B). Vitamin-C (C). Peach21 (D). Pine_Apple (ii) Java? (A). Java (B). Java (C). Java (D). JavaScript Java JavaScript Java (i

Java 2 - Lesson01

Prog1_15th

untitled

オブジェクト指向プログラミング・同演習 5月21日演習課題

DVIOUT-exer

<4D F736F F F696E74202D AC C8899E D834F E >

I java A

JavaプログラミングⅠ

108 頁通過テスト 2. の本文 111 頁紹介文 136 頁練習 5-1 プログラム 136 頁練習 5-1 問 2 末尾に句点追加 158 頁練習問題文 161 頁練習 2-2 コメント文 166 頁練習 3-1 問 1 クラス名を挿入 178 頁通過テスト 3 文字 s を削除 180 頁コ

r2.dvi

デジタル表現論・第6回

Microsoft PowerPoint - lec06 [互換モード]

デジタル表現論・第4回

できるプログラマーを本気で育てる Java 超 Webプログラマーへの第 歩 第 2 回オブジェクト指向 テクノロジックアート 瀬 嘉秀

ガイダンス

Transcription:

第 1 週導入 マルチスレッドとは何か スレッドのライフサイクル クラスThreadのメソッド スレッドの作り方基本の使い方サンプル 演習 1 課題 1

スレッドとは何か (1) スレッド (thread): もともとは 糸 という意味 プログラムの実行単位のこと スレッドはプログラムの一部の機能を実行する 今まで作成したプログラムは処理を 1 つ 1 つ順番に実行していた シングルスレッド ( 仮に BGM が流れる電卓アプレットを作成したとすると ( いらないけど ) そのアプレットは加減乗除の計算を行っているとき BGM が停止してしまう 逆に BGM が流れていると加減乗除ができなくなってしまう 使いものにならない ) BGM 機能付き電卓 ( シングルスレッド ) 青い線が 1 本の糸のように見える

スレッドとは何か (2) 複数の処理を並行して実行するためにはどうしたらいいか? BGM を聴きながら電卓で加減乗除ができるようにするには? マルチスレッドを使う マルチスレッド : 同時に複数のスレッドが存在し それらのスレッドが並行して動作すること 仮想的に複数の処理が並行して動作しているように見える 実際は CPU を短時間で切り替えて使っている BGM 機能付き電卓 ( マルチスレッド ) 2 本の線が並行して走っているように見える あくまで仮想的

いままでやってきたプログラム main(){ int a, b, i;... if(a>b){ a++; else{... for(i=... ){... フローチャート yes a++ no a>b i=...... yes... no... いままで学んできたプログラムは, ある一瞬には, ある 1 つの命令しか実行されていなかった. 処理の流れは一本である. 4

スレッドを利用したプログラム class MyThread extends Thread{ static int a=0;... run(){ for(int i...){ a++;... main(...){... new MyThread().start(); new MyThread().start(); new MyThread().start();... no i=... i=...... no i=... yes... yes no a++... a++ 独立並行して動く. 変数も共有できる. yes a++ 5

現実世界のケース https://cis.k.hosei.ac.jp/~rhuang/miccl/java3/sushiapplet/index.html 二つの職人スレッドいくつの客スレッド 独立並行して動く

スレッドのライフサイクル (Life cycle of a thread) スレッド状態 ( スレッドのライフサイクル ): 誕生 => レディ => 実行 => 死亡 誕生 start 待機休眠中断ブロック 実行可能 yield dispatch 実行 待機 休眠 中断 ブロック スリープ時間が経過 死亡 stop resume

スレッドの定義の仕方 キーワードスレッドクラス名前キーワードキーワード class thread_name extends Thread { // 必要な変数とコンストラクタの宣言 public void run() { run(): 抽象メソッド in Runnable 必ず run() メソッドの再定義が必要です スレッド Count10Thread の定義 スレッド ctt1/2 の run メソッドの実行開始 class Count10Thread extends Thread{ public Count10Thread(String threadname) { super(threadname); public void run(){ for (int i = 0; i < 10; i++) { System.out.println(getName()+" run: ti=" + i); public class Count10ThreadTest { Count10Thread のスレッド run メソッドが終ると消滅 スレッドの名前を取得する public static void main(string[] args) { Count10Thread ctt1 = new Count10Thread("Thread1"); Count10Thread ctt2 = new Count10Thread("Thread2"); ctt1.start(); ctt2.start(); 出力結果 ( 例 )???

Abstract Method ( 抽象メソッド ) キーワードとして abstract を付ける メソッドの中身は空 abstract void function ( ) ;/*{*/ key word return type name parameter body( 空 ) 抽象メソッド (abstract method) を含むクラスは 抽象クラス (abstract class) でなければならない abstract class ClassName{ abstract void FunctionName();

Abstract Class ( 抽象クラス ) インスタンスの生成はできない abstract class AClass{ AClass aclass = new AClass(); 親クラスとしてテンプレートのように使用される abstract class AClass{ public class BClass extends AClass{

Interface ( インターフェース ) クラスや他のインターフェースを作成するためのテンプレートとして使用される interface Interface1{ public class ClassName implements Interface1{ インスタンスの生成はできない Interface1 interface1 = new Interface1(); 初期化されないメンバ変数の宣言はできない interface Interface1{ int var; メソッドはすべて抽象メソッド (abstract method) となる interface Interface1{ (abstract) void function();

マルチスレッド処理機能です これは Java 言語の特徴の一つです Java では スレッドというのは 一つのオブジェクトです クラススレッドのコンストラクタ public Thread() public Thread(String threadname) クラススレッドのインスタンス Thread thread1, thread2; thread1 = new Thread(); thread2 = new Thread( student ); java.lang.object +--java.lang.thread Java API

スレッドの例の出力結果 class Count10Thread extends Thread{ public Count10Thread(String threadname) { super(threadname); public void run(){ for (int i = 0; i < 10; i++) { System.out.println(getName()+" run: ti=" + i); try { // 5000 ミリ秒間スレッドを停止します sleep(5000); // 最大 5000 ミリ秒間スレッドを停止します // sleep((int) ( Math.random() * 5000 )); catch (InterruptedException e) { public class Count10ThreadTest { public static void main(string[] args) { Count10Thread ctt1 = new Count10Thread("Thread1"); Count10Thread ctt2 = new Count10Thread("Thread2"); ctt1.start(); ctt2.start(); Thread1 run: i=0 Thread1 run: i=1 Thread1 run: i=2 Thread1 run: i=3 Thread1 run: i=4 Thread1 run: i=5 Thread1 run: i=6 Thread1 run: i=7 Thread1 run: i=8 Thread1 run: i=9 Thread2 run: i=0 Thread2 run: i=1 Thread2 run: i=2 Thread2 run: i=3 Thread2 run: i=4 Thread2 run: i=5 Thread2 run: i=6 Thread2 run: i=7 Thread2 run: i=8 Thread2 run: i=9 Think about 1. No sleep time 2. A fixed sleep time 3. A maximum sleep time 出力結果 ( 例 ) Thread1 run: i=0 Thread2 run: i=0 Thread2 run: i=1 Thread2 run: i=2 Thread1 run: i=1 Thread1 run: i=2 Thread1 run: i=3 Thread1 run: i=4 Thread1 run: i=5 Thread1 run: i=6 Thread1 run: i=7 Thread1 run: i=8 Thread1 run: i=9 Thread2 run: i=3 Thread2 run: i=4 Thread2 run: i=5 Thread2 run: i=6 Thread2 run: i=7 Thread2 run: i=8 Thread2 run: i=9

スレッドクラスのメソッド (The Thread methods) public void start() runメソッドを起動し 期待された仕事を行う public final void stop() ThreadDeathオブジェクトを送出することによってスレッドを停止させる public final void suspend() スレッドの実行を中断される public final void resume() 中断されたスレッドを再開させる public static void sleep(long millis) スレッドを眠らせる public final void wait() ターゲットオブジェクトを待つためにwaitメソッドを呼び出し 待機状態に入る public final void notify() 待ち行列の先頭にあるスレッドが実行可能状態に移る public final void notifyall() 待ち行列にあるスレッドがすべて実行可能状態に移る public final void setname(string name) スレッドの名前を設定する public final String getname() スレッドの名前を返す public static Thread currentthread() カレントスレッドへの参照を返す public final boolean isalive() スレッドが生きているかを判断する スローされうる例外 IllegalThreadStateException SecurityException InterruptedException IllegalMonitorStateException SecurityException public void run() スレッド start() を呼び出すとき run() メソッドを起動します

簡単な例 A simple example class SleepPrintThread extends Thread { int sleeptime; public SleepPrintThread() { // 0~5 秒間スリープ sleeptime = (int) ( Math.random() * 5000 ); System.out.println( "Name: " + getname() + "; sleep: " + sleeptime ); クラス Thread から導出したサブクラスのスレッド SleepPrintThread を 4 つ生成し その中で Thread メソッド sleep を呼び出します これらのスレッドは 0~5 秒間 ( 乱数で決定 ) 眠ったあと それぞれの名前を表示します public void run() スレッドSleepPrintThreadの { sleepメソッドの実行開始 try { Thread.sleep( sleeptime ); catch ( InterruptedException exception ) { System.err.println( exception.tostring() ); System.out.println( getname() ); スレッド SleepPrintThread の getname メソッドを呼び出す public class PrintTest { public static void main( String args[] ) { SleepPrintThread thread1. thread2; SleepPrintThread thread3, thread4; thread1 = new SleepPrintThread(); thread2 = new SleepPrintThread(); thread3 = new SleepPrintThread(); thread4 = new SleepPrintThread(); thread1.start(); thread2.start(); thread3.start(); thread4.start(); 実行結果 :? 四つ SleepPrintThread オブジェクトを生成するスレッド名前とスリープ時間を出力する run メソッドが実行されると スレッド名前を出力する

簡単な例の実行結果 public class PrintTest { public static void main( String args[] ) { SleepPrintThread thread1. thread2; SleepPrintThread thread3, thread4; thread1 = new SleepPrintThread(); thread2 = new SleepPrintThread(); thread3 = new SleepPrintThread(); thread4 = new SleepPrintThread(); thread1.start(); thread2.start(); thread3.start(); thread4.start(); 結果例 1: Name: Thread-0; sleep: 1774 Name: Thread-1; sleep: 1353 Name: Thread-2; sleep: 4627 Name: Thread-3; sleep: 4003 Thread-1 Thread-0 Thread-3 Thread-2 結果例 2: Name: Thread-0; sleep: 2258 Name: Thread-1; sleep: 91 Name: Thread-2; sleep: 2823 Name: Thread-3; sleep: 1369 Thread-1 Thread-3 Thread-0 Thread-2

マルチスレッドの例 class Count10ThreadDown extends Thread{ public Count10ThreadDown(String threadname){ super(threadname); public void run(){ String threadname = getname(); System.out.println (threadname + " is started!"); for (int i = 0; i < 10; i++) { try {sleep((int)(math.random()* 3000)); catch(interruptedexception e ) {; System.out.println(threadName+" run: ti=" + (9-i)); System.out.println(threadName+" is done!"); On Console Window -------------------------------------- Count-down Thread1 is started! Count-down Thread1 run:i=9 Count-down Thread1 run:i=8 Count-down Thread1 run:i=7 Count-down Thread1 run:i=6 Count-down Thread1 run:i=5 Count-down Thread1 run:i=4 Count-down Thread1 run:i=3 Count-down Thread1 run:i=2 Count-down Thread1 run:i=1 Count-down Thread1 run:i=0 Count-down Thread1 is done! public class MultiThreadDemo { public static void main(string[] args) { Count10ThreadDown thread1 = new Count10ThreadDown("Count-down Thread1"); CountNumThreadUp thread2 = new CountNumThreadUp("Count-up Thread2", 91); thread1.start(); thread2.start(); class CountNumThreadUp extends Thread{ OutputWindow f; int k; public CountNumThreadUp(String threadname, int k){ super(threadname); this.k=k; f = new OutputWindow(threadName); public void run(){ f.newline(getname()+ " is starting n n"); for (int i = 0; i < 10; i++) { f.newline(getname()+" run:i = " + (k+i)+" n"); try {sleep((int)(math.random()* 3000)); catch(interruptedexception e ) {; f.newline(" n"+getname()+ " is finished n"); Two threads: 1. One displays its output on Console 2. Another is on a created window

他のクラス (new) import javax.swing.*; public class OutputWindow extends JFrame { private JTextArea text; public OutputWindow(String title) { super(title); text = new JTextArea(10, 20); add(text); setsize(250, 400); setvisible(true); this.setdefaultcloseoperation(jframe.exit_on_close); public void newline(string line) { text.append(line);

Work in Class Run all examples (Four examples) in this lecture notes

Home Work: 演習 1 p17~p18 の MultiThread Demo のプログラムに以下の thread3,4 を追加せよ Thread3 :Count10ThreadUPスレッド(0から9までカウントアップ) Thread4:CountNumThreadDownスレッド ( 指定した数から10カウントダウン Frameで出力 ) 演習 1 の出力例 Count-down Thread1 is started! Count-up Thread3 is started! Count-up Thread3 run:i=0 Count-down Thread1 run:i=9 Count-up Thread3 run:i=1 Count-down Thread1 run:i=8 Count-up Thread3 run:i=2 Count-down Thread1 run:i=7 Count-up Thread3 run:i=3 Count-up Thread3 run:i=4 Count-down Thread1 run:i=6 Count-up Thread3 run:i=5 Count-up Thread3 run:i=6 Count-down Thread1 run:i=5 Count-up Thread3 run:i=7 Count-down Thread1 run:i=4 Count-up Thread3 run:i=8 Count-down Thread1 run:i=3 Count-down Thread1 run:i=2 Count-down Thread1 run:i=1 Count-up Thread3 run:i=9 Count-up Thread3 is done!

Home Work: 課題 1 Ex1. 以下のような つぎの2つのスレッドクラスを定義せよ SquareThread class: スレッドの名前をセットするコンストラクタ for i=1~9, iの値とスレッドの名前 i*iの値を0~3000ミリ秒のスリープタイムで出力する スレッドの名前と文字列 "is done!" を出力する CubeThread class: スレッドの名前をセットするコンストラクタ for i=1~9 iの値とスレッドの名前 i*i*iの値を0~3000ミリ秒のスリープタイムで出力する スレッドの名前と文字列 is done! を出力する SquareThreadスレッドとCubeThreadスレッドを生成してスタートさせる Javaアプリケーションプログラムを記述せよ ( ヒント : Count10ThreadUp Count10ThreadDownを参照 ) Ex1 の出力例 Square Thread is started! Cube Thread is started! Square Thread i=1 i*i = 1 Square Thread i=2 i*i = 4 Square Thread i=3 i*i = 9 Cube Thread i=1 i*i*i = 1 Square Thread i=4 i*i = 16 Cube Thread i=2 i*i*i = 8 Square Thread i=5 i*i = 25 Square Thread i=6 i*i = 36 Cube Thread i=3 i*i*i = 27 Square Thread i=7 i*i = 49 Square Thread i=8 i*i = 64 Cube Thread i=4 i*i*i = 64 Cube Thread i=5 i*i*i = 125 Cube Thread i=6 i*i*i = 216 Square Thread i=9 i*i = 81 Square Thread is done! Cube Thread i=7 i*i*i = 343 Cube Thread i=8 i*i*i = 512 Cube Thread i=9 i*i*i = 729 Cube Thread is done! Ex2 の出力 Ex2. Ex1 を Frame を使って書き換えよ ( 演習 1 にの CountNumThreadUp と CountNumThreadDown を参照 )