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関数で待つ。

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;
 }
 }
 }
 
}
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。