多线程几乎是所有游戏都要用到的技术(当然除了五子棋等等)因为很多大型游戏在一个线程的运行下是非常的缓慢的,那我们要想知道如何利用线程做事,那就首先要知道线程是什么,首先,线程不是进程,在多进程OS中,通常是在一个进程中包括多个线程,每个线程都是作为利用CPU的基本单位,是花费最小开销的实体。也就是说,一个进程是由一个或者多个进程来运行的,这样我们开始用线程来写进程程序。
这一次我们先来做一个简单的东西,就是让一个图片在一个窗体中平行的动起来,要想让它动起来,我们就要不停的改变它的位置,这里面有一个类,类名叫Thread,这个类就是我们主要用到的,从源代码上可以看到,它是继承超级父类Objiect的,我们在使用这个类的时候,不需要导入,
从API上我们可以看到最后一句话,清清楚楚的告诉了我们怎么去用这个类,我这里是用所提供的方法,用一个子类来继承Thread,然后重写里面的run方法,这个方法里面要写上我们要做的事情,见代码:
public class MyThread extends Thread{ private JLabel j; int x = 1 ,y = 1; private int speedx = 1; private int speedy = 1; //构造方法,传入放了图片的label public MyThread(JLabel j){ this.j =j; } public void run() { j.setBounds(x+=speedx, y+=speedy, 50, 50); } }
下一步就是如何启动线程呢?Thread有一个start方法,就是启动线程的,所以我们在frame类中实例化MyThread类后,调用start方法就可以了。
在启动线程后,我们会发现图片位置变换的非常快,几乎看不到影子,如何让它慢下来呢?这里面还有一个方法 sleep 方法,方法的参数是以毫秒为单位的时间,这个方法的用处就是让线程睡眠一段时间,这段时间由参数决定,这样我们就可以在run方法里面用到这个方法,让它适当的睡眠就可以让图片慢下来,小伙伴们可以试试。
这里面有三个方法要提到一下,stop、suspend和resume,这三个方法在API上都可以查到,但是上面明显的表明的三个字:已过时。这三个方法都有缺点,具体的原因API上面有,我在用前两种方法的时候是会有bug但是第三个暂时没测出来,小伙伴们可以自己去试一下,一般简单的暂停、停止可以用if、contimue、break搭配完成,下面展示一个完整的线程代码,虽然简单、不精细,但是小伙伴们也可以拿去测试理解一下。
import java.awt.Color; import java.awt.Graphics; import java.util.ArrayList; import java.util.Random; public class Ball extends Thread{ private int Radius = 20; private int xSpeed = 5; private int ySpeed = 5; private int xLocate = 1; private int yLocate = 1; private boolean stopFlag = false; private boolean pauseFalg = false; private Color colo = new Color(new Random().nextInt(256),new Random().nextInt(256),new Random().nextInt(256)); private Graphics g ; private MainFrame frame; private ArrayList<Ball> arr; public Ball(MainFrame frame){ this.frame = frame; } public void run(){ initData(); while(true){ g = frame.getEast().getGraphics(); try { this.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } isHit();isHitBall(); g.setColor(frame.getEast().getBackground()); if(pauseFalg){ continue; } g.fillOval(xLocate, yLocate, Radius*2, Radius*2); xLocate += xSpeed; yLocate += ySpeed; if(stopFlag){ break; } g.setColor(colo); g.fillOval(xLocate, yLocate, Radius*2, Radius*2); } } public void isHit(){ if(xLocate > frame.getEast().getWidth()){ xSpeed = -xSpeed; //colo = new Color(new Random().nextInt(256),new Random().nextInt(256),new Random().nextInt(256)); } if(yLocate > frame.getEast().getHeight()){ ySpeed = -ySpeed; //colo = new Color(new Random().nextInt(256),new Random().nextInt(256),new Random().nextInt(256)); } if(xLocate <= 0 && xSpeed < 0){ xSpeed = -xSpeed; //colo = new Color(new Random().nextInt(256),new Random().nextInt(256),new Random().nextInt(256)); } if(yLocate <= 0 && ySpeed < 0){ ySpeed = -ySpeed; //colo = new Color(new Random().nextInt(256),new Random().nextInt(256),new Random().nextInt(256)); } } public void initData(){ Random i = new Random(); xSpeed = i.nextInt(2)+5; i = new Random(); ySpeed = i.nextInt(2)+5; i = new Random(); Radius = i.nextInt(10)+20; } }
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class MainFrame { private Ball ball; private static MainFrame mf = new MainFrame(); private ArrayList<Ball> ballArray = new ArrayList<Ball>(); public static void main(String[] args) { mf.initUI(); } JPanel jp = new JPanel(); public void initUI(){ JFrame frame = new JFrame(); frame.setSize(600, 500); frame.setDefaultCloseOperation(3); frame.setLayout(new BorderLayout()); JPanel west = new JPanel(); west.setPreferredSize(new Dimension(100,100)); west.setBackground(Color.black); String[] buttonName = {"开始一个球","暂停","停止","继续"} ; for(int i = 0;i<4;i++){ JButton jbu = new JButton(buttonName[i]); west.add(jbu); jbu.addActionListener(l); } //jp.setPreferredSize(new Dimension(500,500)); frame.add(jp,BorderLayout.CENTER); //jp.setBackground(Color.black); frame.add(west,BorderLayout.WEST); frame.setVisible(true); } //东边面板 public JPanel getEast(){ return jp; } ActionListener l = new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { String name = e.getActionCommand(); if(name.equals("开始一个球")){ ball = new Ball(mf); ballArray.add(ball); ball.start(); } else if(name.equals("暂停")){ for(int i = 0;i<ballArray.size();++i){ Ball b = ballArray.get(i); b.setPauseFalg(true); } } else if(name.equals("停止")){ for(int i = 0;i<ballArray.size();++i){ Ball b = ballArray.get(i); b.setStopFlag(true); } }else if(name.equals("继续")){ for(int i = 0;i<ballArray.size();++i){ Ball b = ballArray.get(i); b.setPauseFalg(false); } } } }; public ArrayList<Ball> getBallArray() { return ballArray; } }
相关推荐
java程序员初学多线程的可以看看哦 csdn积分只要一分哦
#### 三、Java多线程程序设计初步 ##### 1. 线程的创建 - **继承Thread类**: - 重写`run()`方法。 - **实现Runnable接口**: - 实现`run()`方法。 - 将`Runnable`对象传递给`Thread`构造函数。 ##### 2. 线程的...
│ 高并发编程第一阶段05讲、采用多线程方式模拟银行排队叫号.mp4 │ 高并发编程第一阶段06讲、用Runnable接口将线程的逻辑执行单元从控制中抽取出来.mp4 │ 高并发编程第一阶段07讲、策略模式在Thread和Runnable...
4. **线程同步机制**:如`synchronized`关键字或`Lock`对象,保证多线程环境下的数据一致性,防止并发问题。 5. **异常处理**:确保即使在出现异常的情况下,时钟仍然能够正常运行,避免程序崩溃。 从代码实现的...
在Java编程语言中实现贪吃蛇游戏,我们会涉及多线程技术,这是理解并发处理和提升程序性能的关键概念。下面我们将详细探讨如何使用Java实现一个多线程的Snake游戏。 首先,贪吃蛇游戏的核心是蛇的移动和食物的生成...
总的来说,Java游戏编程初步会引导初学者理解Applets的开发流程、线程的概念及其在游戏中的应用,为进一步深入Java游戏开发打下基础。虽然这个领域可能需要更多的学习,如图形库、物理引擎和网络编程,但这个起点为...
在编程领域,多线程是实现并发执行...通过以上介绍,希望能为初学者提供一个多线程的初步认识。在实际开发中,多线程的运用远不止这些,还需要考虑线程安全、死锁等问题。不断学习和实践,才能更好地掌握多线程技术。
结合上述知识点,可以推测该文档是关于Java多线程编程的基础教学内容,涵盖了线程创建、启动、接口实现、线程生命周期、以及线程安全的初步介绍。对于Java开发者来说,这些知识点是构建并发应用程序的基石。
多线程的了解,初步实现
通过龟兔赛跑的例子,学生已经初步了解了多线程的概念及编程方法。此时可以进一步提出思考题,例如如果乌龟和兔子在赛跑过程中需要吃东西 怎么办?如果乌龟和兔子都要吃同一个篮子里面 的食物怎么办?这时可以引入...
在学习过程中,应着重理解每个概念的实际应用场景,例如如何通过类和对象来抽象现实世界的问题,如何使用异常处理来增强程序的健壮性,以及如何利用多线程提升程序效率。同时,不断通过做题和编写小程序来锻炼解决...
- Java内置对多线程的支持,可以通过实现Runnable接口或继承Thread类创建线程。 - 线程同步机制包括synchronized关键字、wait(), notify(), notifyAll()方法以及Lock接口。 8. **网络编程**: - Java提供了...
11. **多线程**:Java内置对多线程的支持,通过Thread类或实现Runnable接口可以创建并管理线程。 学习Java语言结构的过程中,不仅需要理解和掌握这些知识点,还要通过编写实际的代码来加深印象,不断实践和调试。配...
Java内置了对多线程的支持,允许开发者轻松创建和控制线程,这对于处理复杂的动画、游戏逻辑和用户输入非常有用。 - **Thread类**:是Java中表示线程的实体,可以通过继承`Thread`类并重写`run()`方法来自定义线程...
通过以上内容的学习,可以初步掌握Java多线程的基本概念和操作。然而,实际应用中还需要考虑线程优先级、线程池、线程通信、线程中断、异常处理等多个方面,这些都是Java线程编程的重要组成部分。在实践中不断探索和...
Java线程是Java编程中的重要概念,它允许程序并发执行多...通过以上讲解,你已经对Java线程有了初步了解,从创建线程到线程同步、通信、管理,以及线程的特殊特性。实践这些知识点,将有助于你在多线程编程中游刃有余。