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