Javaマルチスレッドが正方形レースを実現します。
本論文の例では、Javaのキューブレースを実現するための具体的なコードを共有します。参考にしてください。具体的な内容は以下の通りです。
一つの図形のインターフェイス上に同じランナーラインブロックを2つ作り、スタートラインはインターフェースの左側に位置し、Aブロックは先に動き始め、右に50ピクセル移動して停止し、Bブロックは動き始め、右に100ピクセル移動して停止し、Aブロックは右に100ピクセル移動してから停止し、Bブロックは動き始めます。あるブロックが終点に達するまで、画面に勝利情報が表示されます。
1) 一つのthreadA、ThreadB、ThreadFrameクラスをカスタマイズします。
2) グローバル変数、ブロックの位置、総長さ、チャンピオン、睡眠時間などを指定します。ブール値ブロックは変数、ゲーム継続変数、描画変数を待ちます。
3) ThreadA(ThreadB):WaitA(waitB)変数のリリースを待つ。すなわち、他のブロックの更新が完了するまで待つ。そして移動する長さをランダムに生成し、移動後の位置と全体の長さの関係を確認してゲームが終了するかどうかを判断します。位置情報を更新し、図形描画変数を変更して、図形描画スレッドの再描画を通知します。ロック自体は、もう一つのブロックスレッドをリリースします。
4) ThreadFrame:クラスオブジェクトを作成し、run関数を書き換えて、図形描画変数のコマンドを待ちます。図形描画コマンドを受け、絵を描き直し、ゲームのリリースが終了したと判断し、図形描画コマンドをリセットします。
5) コンストラクタ、paint関数を描画し、ゲームが終了するかどうかを判断します。終了すると、プリントチャンピオンは誰ですか?終了します。
6) メイン関数は、threadA、ThreadB、ThreadFrameクラスのオブジェクトを定義し、実行します。サブスレッドの終了をジッon関数で待つ。
一つの図形のインターフェイス上に同じランナーラインブロックを2つ作り、スタートラインはインターフェースの左側に位置し、Aブロックは先に動き始め、右に50ピクセル移動して停止し、Bブロックは動き始め、右に100ピクセル移動して停止し、Aブロックは右に100ピクセル移動してから停止し、Bブロックは動き始めます。あるブロックが終点に達するまで、画面に勝利情報が表示されます。
1) 一つのthreadA、ThreadB、ThreadFrameクラスをカスタマイズします。
2) グローバル変数、ブロックの位置、総長さ、チャンピオン、睡眠時間などを指定します。ブール値ブロックは変数、ゲーム継続変数、描画変数を待ちます。
3) ThreadA(ThreadB):WaitA(waitB)変数のリリースを待つ。すなわち、他のブロックの更新が完了するまで待つ。そして移動する長さをランダムに生成し、移動後の位置と全体の長さの関係を確認してゲームが終了するかどうかを判断します。位置情報を更新し、図形描画変数を変更して、図形描画スレッドの再描画を通知します。ロック自体は、もう一つのブロックスレッドをリリースします。
4) ThreadFrame:クラスオブジェクトを作成し、run関数を書き換えて、図形描画変数のコマンドを待ちます。図形描画コマンドを受け、絵を描き直し、ゲームのリリースが終了したと判断し、図形描画コマンドをリセットします。
5) コンストラクタ、paint関数を描画し、ゲームが終了するかどうかを判断します。終了すると、プリントチャンピオンは誰ですか?終了します。
6) メイン関数は、threadA、ThreadB、ThreadFrameクラスのオブジェクトを定義し、実行します。サブスレッドの終了をジッon関数で待つ。
import java.awt.*;
import javax.swing.*;
public class four3 extends JFrame {
//
static int positionA = 50, positionB = 50, distanceAll = 1600;
static int RecWidth = 50, RecHeight = 50;
static char winner;
static long sleeptime = 300;
static boolean waitA = true, waitB = true, gaming = true, unrepaint = true;
//
public four3() {
setTitle(" : ");
setBackground(Color.WHITE);
setSize(1600, 500);
setLocation(0, 200);
setResizable(false);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
//
public void paint(Graphics g) {
// TODO Auto-generated method stub
g.clearRect(0, 0, 1600, 900);
g.setColor(Color.RED);
g.fillRect(positionA - 50, 100, RecWidth, RecHeight);
g.setColor(Color.BLUE);
g.fillRect(positionB - 50, 300, RecWidth, RecHeight);
if (!gaming) {
g.setFont(new Font(" ", ALLBITS, 50));
if (winner == 'A') {
g.setColor(Color.RED);
g.drawString(new String("Winner Is The Red One!"), 550, 250);
} else if (winner == 'B') {
g.setColor(Color.BLUE);
g.drawString(new String("Winner Is The Blue One!"), 550, 250);
}
}
}
public static void main(String[] args) {
waitA = false;
waitB = true;
unrepaint = false;
threadframe tf = new threadframe();
threadA tA = new threadA();
threadB tB = new threadB();
tf.start();
tA.start();
tB.start();
try {
tf.join();
tA.join();
tB.join();
} catch (Exception e) {
// TODO: handle exception
}
return;
}
//
public static class threadA extends Thread {
public void run() {
while (gaming) {
while (waitA) {
if (!gaming)return;
System.out.print("");
}
try {
sleep(sleeptime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int distance = (int) (Math.random() * 100000) % 100;
positionA += distance;
if (positionA >= distanceAll) {
positionA = distanceAll;
unrepaint = false;
gaming = false;
winner = 'A';
}
unrepaint = false;
waitA = true;
waitB = false;
}
}
}
//
public static class threadB extends Thread {
public void run() {
while (gaming) {
while (waitB) {
if (!gaming)return;
System.out.print("");
}
try {
sleep(sleeptime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int distance = (int) (Math.random() * 100000) % 100;
positionB += distance;
if (positionB >= distanceAll) {
positionB = distanceAll;
unrepaint = false;
gaming = false;
winner = 'B';
}
unrepaint = false;
waitB = true;
waitA = false;
}
}
}
//
public static class threadframe extends Thread {
four3 jiemian = new four3();
public void run() {
while (gaming) {
while (unrepaint) {
if (!gaming)return;
System.out.print("");
}
jiemian.repaint();
unrepaint = true;
}
}
}
}
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。