《Java 2D游戏编程入门》—— 1.4 创建定制的渲染线程

简介: 该变量的声明中带有volatile关键字。由于这个变量是一个基本类型,并且可以从多个线程中访问它,因此必须要告诉编译器总是从内存中读取该变量。没有使用volatile这个关键字的话,变量可能会被Java虚拟机(JVM)用一个缓冲值来进行优化,并且线程可能变得无法停止下来。

本节书摘来异步社区《Java 2D游戏编程入门》一书中的第1章,第1.4节,作者:【美】Timothy Wright(莱特),更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.4 创建定制的渲染线程

除了使用前面的代码来执行定制的渲染外,还需要一个定制的渲染线程。为了只是关注线程问题,位于javagames.render包中的RenderThreadExample实际上不会在屏幕上绘制任何内容,它只是在渲染代码应该出现的地方打印出“Game Loop”。下面的示例将RenderThreadExample和前面的代码组合起来,创建了一个主动渲染的应用程序。

在RenderThreadExample中,首先需要注意的是,它实现了一个可运行的接口。这个可运行的接口包含一个单个的方法,即public void run()。这个方法包含了渲染循环,并且它只调用一次。当它返回的时候,线程结束并且不能再次使用。为了防止run方法中的代码在程序完成之前退出,Boolean类型的running变量保持run方法重复运行。

private volatile boolean running;```
注意,该变量的声明中带有volatile关键字。由于这个变量是一个基本类型,并且可以从多个线程中访问它,因此必须要告诉编译器总是从内存中读取该变量。没有使用volatile这个关键字的话,变量可能会被Java虚拟机(JVM)用一个缓冲值来进行优化,并且线程可能变得无法停止下来。

此外,注意RenderThreadExample中的sleep()方法,它用来将应用程序减慢到一个较为合理的运行速度。sleep()方法接受一个毫秒值,然后将自身挂起达到一定的时间,以允许其他的线程使用CPU。

一旦应用程序关闭了,渲染线程也应该停止。通过添加一个窗口监听器,程序可以响应窗口关闭事件。在这个例子中,程序调用onWindowClosing()。如果你的程序需要关闭那些不再需要的资源和文件,那么在这里做这些事情。

app.addWindowListener( new WindowAdapter() {
  public void windowClosing( WindowEvent e ) {
    app.onWindowClosing();
  }
});`
要关闭渲染线程,running变量应设置为false。然而,渲染线程可能只是读取running变量的值,并且进入睡眠。要确保该线程已经停止了,应调用join()方法。该方法将会等待,直到该线程结束,并且run方法已经返回。如果没有向join()方法传入一个超时值,将会在线程结束前造成阻塞,因此,如果没有提供超时值的话,请确保线程将会结束。

最后,必须通过手动调用System.exit(0)来关闭程序。之前,当在JFrame中设置JFrame.EXIT_ON_CLOSE标志的时候,程序将会结束。这时应用程序负责处理关闭,只有在调用了exit方法的时候,程序才会结束。如果应用程序在关闭后挂起,通常是因为程序员忘了调用System.exit()。

package javagames.render;
import java.awt.event.*;
import javax.swing.*;
public class RenderThreadExample extends JFrame implements Runnable {
  private volatile boolean running;
  private Thread gameThread;
  public RenderThreadExample() {
  }
  protected void createAndShowGUI() {

    setSize( 320, 240 );
    setTitle( "Render Thread" );
    setVisible( true );

    gameThread = new Thread( this );
    gameThread.start();
  }

  public void run() {
    running = true;
    while( running ) {
      System.out.println( "Game Loop" );
      sleep( 10 );
    }
  }
  private void sleep( long sleep ) {
    try {
      Thread.sleep( sleep );
    } catch( InterruptedException ex ) { }
  }
  protected void onWindowClosing() {
    try {
      System.out.println( "Stopping Thread..." );
      running = false;
      gameThread.join();
      System.out.println( "Stopped!!!" );
    } catch( InterruptedException e ) {
      e.printStackTrace();
    }
    System.exit( 0 );
  }
  public static void main( String[] args ) {
    final RenderThreadExample app = new RenderThreadExample();
    app.addWindowListener( new WindowAdapter() {
      public void windowClosing( WindowEvent e ) {
        app.onWindowClosing();
      }
    });
    SwingUtilities.invokeLater( new Runnable() {
      public void run() {
        app.createAndShowGUI();
      }
    });
  }
相关文章
|
9月前
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
721 0
|
9月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
428 1
|
9月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
394 1
|
10月前
|
Java
java入门代码示例
本文介绍Java入门基础,包含Hello World、变量类型、条件判断、循环及方法定义等核心语法示例,帮助初学者快速掌握Java编程基本结构与逻辑。
690 0
|
10月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
|
10月前
|
Java API 数据库
2025 年最新 Java 实操学习路线,从入门到高级应用详细指南
2025年Java最新实操学习路线,涵盖从环境搭建到微服务、容器化部署的全流程实战内容,助你掌握Java 21核心特性、Spring Boot 3.2开发、云原生与微服务架构,提升企业级项目开发能力,适合从入门到高级应用的学习需求。
2860 0
Java 数据库 Spring
435 0
|
10月前
|
前端开发 Java 数据库连接
帮助新手快速上手的 JAVA 学习路线最详细版涵盖从入门到进阶的 JAVA 学习路线
本Java学习路线涵盖从基础语法、面向对象、异常处理到高级框架、微服务、JVM调优等内容,适合新手入门到进阶,助力掌握企业级开发技能,快速成为合格Java开发者。
1358 3
|
存储 Java API
Java——Stream流(1/2):Stream流入门、Stream流的创建(认识Stream、体验Stream流、Stream流的使用步骤、获取Stream流的方法)
Java——Stream流(1/2):Stream流入门、Stream流的创建(认识Stream、体验Stream流、Stream流的使用步骤、获取Stream流的方法)
562 0
|
安全 Java
从零开始学习 Java:简单易懂的入门指南之不可变集合、方法引用(二十六)
从零开始学习 Java:简单易懂的入门指南之不可变集合、方法引用(二十六)

热门文章

最新文章