pi-12. Java標準ライブラリによ
る時間制御と並行処理
1
金子邦彦
Java マスター講座:基礎から応用まで)
URL: https://www.kkaneko.jp/pro/pi/index.html
Java標準ライブラリを用いた時間操作、スリープ、
似乱数、マルチスレッドの基本的な使用方法の習得
学習内容の構成
1. 時間・スリープ:現在日時の取得、日時計算、
Thread.sleepによる処理の一時停止
2. 疑似乱数java.util.Randomクラスによるランダムな
数値の生成
3. マルチスレッドThreadクラスの継承による複数処
理の並行実行
前提:Javaの基本文法、クラスとオブジェクト、継承
の理解
意義:実用的なプログラム開発に必要な並行処理と
イミング制御の基礎の獲得
2
GDB online
3
Java などのプログラミング言語の体
験,演習ができるオンラインサービス
https://www.onlinegdb.com/
オンラインなので、「秘密にしたいプログラム」を
扱うには十分な注意が必要
GDB online Java を動かす手順
ウェブブラウザを起動する
次の URL を開く
https://www.onlinegdb.com/
4
Language」のところで,「Java」を選ぶ
5
6
ソースコードを入れる
実行.実行結果を確認
Run」をクリック.
12-1. Java の標準ライブラリ
7
ライブラリ
複数のプログラムが共有して使
えるような機能を持ったプログ
ラムのこと
プログラミング言語処理系に元
から備わっているライブラリ
ことを,標準ライブラリという
8
Java の標準ライブラリの機能
コレクション (ArrayList, HashMap など)
ラッパクラス(Integer, Double など)
文字列 (String)
その他
時間,スリープ
疑似乱数
スレッド
標準入出力
数値処理
ファイル読み書き など
9
12-2. 時間,スリープ
10
時間,スリープ
いまの日時(日付、時刻)を知る
日時に関する計算
処理を一定時間止める(タイミング,一定時間ご
との監視など)
11
Java での時間,スリープ
いまの日時(日付、時刻)を知
java.time.LocalDateTime.now()
日時に関する計算
plusHours(1) 1時間後
plusMinutes(1) 1分後
plusSeconds(1) 1秒後
処理を一定時間止める(タイミング,一定時間ごとの
監視など)
Thread.sleep(2000) 2秒止まる.
2000」とあるのはミリ秒単位
12
演習
資料:15 17
トピックス
日時に関する計算
処理を一定時間止める
13
日時に関する計算
14
次のソースコードを入れる
実行結果の確認
世界標準時が表示される.9時間ずれている.
日時に関する計算
15
次のソースコードを入れる
実行結果の確認
処理を一定時間止める
16
2秒止まる
2000
とあるのは
ミリ秒単位
次のソースコードを入れる
実行結果の確認
12-3. スリープに関する演習
17
18
Ball クラスのオブジェクト
y
x
x
属性 x の値を 2 増やし,
属性 y の値を 3 増やすメソッド move
演習
資料:21 25
【トピックス】
スリープ
19
20
次のソースコードを入れる
次のページに続く
21
実行結果の確認
動く前は 0 0.動いた後は 2 3
10回動かす
for 文,メソッド move
動かす前に1秒止まる
Thread.sleep(1000)
22
23
public class Main の中を次のように書き換える
24
1つ表示のたびに,
1秒止まる
実行結果の確認
12-4. 疑似乱数
25
疑似乱数とは
疑似乱数は,コンピュータによって生成されたラ
ンダムな数や数の列
「乱数」ということもある
疑似乱数
アルゴリズムにより生成される数である.再現
可能.その意味で「疑似」
26
演習
資料: 29
【トピックス】
疑似乱数
27
28
次のソースコードを入れる
nextInt(10) は、0から9までの数(10通り)の中から
1つをランダムに得る
実行のたびに
結果は変わる
12-5. マルチスレッド
29
スレッド
スレッドとは,処理の流れのこと.
複数の処理を並行させたいときにはマルチス
レッド(複数のスレッド)で処理を行う
30
31
通常のプログラム実行
シングルスレッド
マルチスレッド
ここではスレッド数は2.
(スレッド数は3以上にもできる)
演習
資料:34 41
【トピックス】
マルチスレッド
32
33
次のソースコードを入れる
シングルスレッドの例
Hello 100回表示.表示のたびに 1秒止まる.
34
実行結果の確認
1つ表示のたびに,
1秒止まる
マルチスレッドの例
35
メイン
起動
別スレッド
マルチスレッドの例
36
run メソッドの中に,
別スレッドでの処
理を書く
Java では標準ライブラリのクラス Thread サブクラスを定義
新しいスレッドを起動
オブジェクトを生成
前のソースコードは消して,次のソースコードを入れる
37
実行結果の確認
2秒ごとに Morning を表示
マルチスレッドの例
38
メイン
起動
別スレッド
別スレッド
マルチスレッドの例
39
前のソースコードに書き加える
40
実行結果の確認
2秒ごとに Morning を表示
3秒ごとに Hello を表示
関連ページ
Java プログラミング入門
GDB online を使用
https://www.kkaneko.jp/pro/ji/index.html
Java の基本
Java Tutor, GDB online を使用
https://www.kkaneko.jp/pro/pi/index.html
Java プログラム例
https://www.kkaneko.jp/pro/java/index.html
41
class Student {
String id;
String name;
String address;
public Student(String id, String name, String address) {
this.id = id;
this.name = name;
this.address = address;
}
public void printout() {
System.out.printf("%s %s %s", this.id, this.name, this.address);
}
};
public class Main
{
public static void main(String[] args) {
Student k = new Student("t001", "kaneko", "matsunaga");
k.printout();
}
}
42
12-1
public class Main
{
public static void main(String[] args) {
java.time.LocalDateTime d;
d = java.time.LocalDateTime.now();
System.out.println(d);
}
}
-----------------------
public class Main
{
public static void main(String[] args) {
java.time.LocalDateTime d;
d = java.time.LocalDateTime.now();
System.out.println(d);
System.out.println(d.plusHours(1));
System.out.println(d.plusMinutes(1));
System.out.println(d.plusSeconds(1));
}
}
-----------------------
public class Main
{
public static void main(String[] args) {
java.time.LocalDateTime d;
d = java.time.LocalDateTime.now();
System.out.println(d);
try {
Thread.sleep(2000);
}
d = java.time.LocalDateTime.now();
System.out.println(d);
}
}
43
12-2
class Ball {
double x;
double y;
public Ball(double x, double y) {
this.x = x;
this.y = y;
}
public void move() {
this.x = this.x + 2;
this.y = this.y + 3;
}
public void printout() {
System.out.printf("%f %f¥n", this.x, this.y);
}
};
public class Main
{
public static void main(String[] args) {
Ball b = new Ball(0, 0);
k.printout();
}
}
------------------------------
class Ball {
double x;
double y;
public Ball(double x, double y) {
this.x = x;
this.y = y;
}
public void move() {
this.x = this.x + 2;
this.y = this.y + 3;
}
public void printout() {
System.out.printf("%f %f¥n", this.x, this.y);
}
};
public class Main
{
public static void main(String[] args) {
Ball b = new Ball(0, 0);
b.printout();
for(int i = 1; i <= 10; i++) {
try {
Thread.sleep(1000);
} catch(InterruptedException e) {}
b.move();
b.printout();
}
}
}
44
12-3
public class Main
{
public static void main(String[] args) {
int a;
java.util.Random r = new java.util.Random();
a = r.nextInt(10);
System.out.println(a);
}
}
45
12-4
12-5
class Morning extends Thread {
public void run() {
for(int i = 0; i < 50; i++) {
try {
Thread.sleep(2000);
} catch(InterruptedException e) {}
System.out.println("Morning");
}
}
}
public class Main
{
public static void main(String[] args) {
Morning m = new Morning();
m.start();
}
}
46
12-5
class Morning extends Thread {
public void run() {
for(int i = 0; i < 50; i++) {
try {
Thread.sleep(2000);
} catch(InterruptedException e) {}
System.out.println("Morning");
}
}
}
class Hello extends Thread {
public void run() {
for(int i = 0; i < 50; i++) {
try {
Thread.sleep(3000);
} catch(InterruptedException e) {}
System.out.println("Hello");
}
}
}
public class Main
{
public static void main(String[] args) {
Morning m = new Morning();
m.start();
Hello h = new Hello();
h.start();
}
}
47