`
剑&箫
  • 浏览: 54554 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

多线程入门总结

    博客分类:
  • Java
阅读更多
什么是线程
提到线程,首先要了解进程。每个程序都有一个入口,在程序运行时,系统首先从程序入口开始按语句的顺序执行,知道整个程序结束。简单的说进程就是程序在处理机中的一次运行,不仅包括程序代码,同时也包括执行指令所需的任何系统资源。线程是进程中的一个实体,是比进程单位更小的执行单位,与进程不同的时,它没有入口和出口,因此自身不能自动执行,是在某一进程中的,由进程触发执行。每个程序都至少有一个线程,即主线程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。利用多线程同时完成不同的任务,可以节省很多时间。

线程与进程的区别
1.简单而言,一个应用程序就是一个进程,线程则是进程内部的多个运行单位。
2.多个进程内部数据和状态都是完全独立的,而线程是共享一块内存空间和一组系统资源,在程序内部可以互相调用;而进程间通信大多数情况是必须通过网络实现的。
3.线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担要小。

继承Thread类实现多线程
在JAVA中,每个线程对象都是一个继承了java.util.Thread类的对象或implements了java.util.Runnable接口的类的对象,线程的启动是通过调用线程对象的start()方法启动的,线程运行是从线程对象的run方法开始,当run方法结束后,线程即运行结束。下面通过以继承Thread类,作简单的弹球游戏为例实现多线程。
首先要有一个窗体,在前面的总结中已经有了创建窗体的经验,这里不重述了,相关代码如下:
this.setTitle("弹球游戏");//设置窗体标题
this.setSize(500,600);//设置窗体大小
this.getContentPane().setBackground(Color.RED);//设置背景颜色


this.setLayout(new FlowLayout());//设置画布

JButton bt = new JButton("开始");//创建按钮对象

this.add(bt);//添加按钮

this.setDefaultCloseOperation(3);//点击关闭时退出窗体
this.setVisible(true);//将窗体显示在屏幕上

final Graphics g = this.getGraphics();//设置布局管理器
这些语句都是写在一个初始化窗体的方法内的。有了窗体之后,需要给按钮添加动作监听器,按一下“开始”按钮就能画圆,这里实现监听器接口就不要重新定义一个类了,直接在初始化窗体的方法内写一个匿名内部类就可以了,格式如下:
//匿名内部类,动作监听器
ActionListener atl = new ActionListener(){   };

实现监听器之后用bt.addActionListener(atl)这一句给按钮添加监听器,这个方法的完整代码如下:
/**
* 初始化窗体
*/
public void init(){
this.setTitle("弹球游戏");//设置窗体标题
this.setSize(500,600);//设置窗体大小
this.getContentPane().setBackground(Color.RED);//设置背景颜色


this.setLayout(new FlowLayout());//设置画布

JButton bt = new JButton("开始");//创建按钮对象

this.add(bt);//添加按钮

this.setDefaultCloseOperation(3);//点击关闭时退出窗体
this.setVisible(true);//将窗体显示在屏幕上

final Graphics g = this.getGraphics();//设置布局管理器


//匿名内部类,动作监听器
ActionListener atl = new ActionListener(){

public void actionPerformed(ActionEvent e){

}


};


bt.addActionListener(atl);//给按钮添加监听器

}
现在需要重新定义一个Ball类来实现画球,并且实现球的移动。首先我们要明白要实现球的移动就是在一个while循环中不停的画圆,在画之前首先要把先前画的擦除掉,就可以实现球的移动,擦除掉原先的球就是将圆重新画一遍,只不过颜色为窗体的背景色。具体代码如下:
//小球移动的方法
public void move() {

while(true){
//清除图像
g.setColor(blf.getContentPane().getBackground());
g.fillOval(x0,y0,30,30);

g.setColor(Color.BLUE);
g.fillOval(x0+=x,y0+=y,30,30);

}
现在可以实现多线程了,首先是Ball类要继承Thread类,然后要重写父类的public void run()方法,即调用move()方法,最后在匿名内部类里面创建Ball类的两个对象,并调用start()方法,就可以实现两个球在窗体里面移动了。具体代码如下:
public class Ball extends Thread{

java.util.Random rd = new java.util.Random();

private int x0=50,y0=50;
private int x,y;

private BallFrame blf;
Graphics g;

public Ball(BallFrame blf){
this.blf = blf;
g = blf.getGraphics();

//小球的初始位置
x0=rd.nextInt(300)+50;
y0=rd.nextInt(300)+50;

//小球的增量
x = rd.nextInt(50)-30;
y = rd.nextInt(50)-30;

}

//重写父类的方法
public void run(){
move();
}

//小球移动的方法
public void move() {

while(true){
//清除图像
g.setColor(blf.getContentPane().getBackground());
g.fillOval(x0,y0,30,30);
g.setColor(Color.BLUE);
g.fillOval(x0+=x,y0+=y,30,30);

}

try{
Thread.sleep(100);
}catch(Exception ep){
ep.printStackTrace();
}
}

}

}

匿名内部类重写的方法如下:
//匿名内部类,动作监听器
ActionListener atl = new ActionListener(){

public void actionPerformed(ActionEvent e){
Ball b = new Ball(BallFrame.this);
b.start();

Ball b1 = new Ball(BallFrame.this);
b1.start();

}


};
但是这样发现很多问题,比如球碰撞到四壁时没有弹回,两球相撞时也没有弹回等等,针对地一个问题,对球移动的方法的代码修改如下:
//小球移动的方法
public void move() {

while(true){
//清除图像
g.setColor(blf.getContentPane().getBackground());
g.fillOval(x0,y0,30,30);

if (x!=0){
if (x0<=8||x0>=480){//左右两壁
x=-x;
}else if (y0<=30||y0>=580){//上下两壁
y=-y;
}else if ((x0<=8&&y0<=30)||(x0<=8&&y0>=580)||(x0>=480&&y0<=30)||(x0>=480&&y0>=580)){//垂直碰撞四壁
x=-x;y=-y;
}

g.setColor(Color.BLUE);
g.fillOval(x0+=x,y0+=y,30,30);

}

try{
Thread.sleep(100);
}catch(Exception ep){
ep.printStackTrace();
}
}

}
运行之后的截图如下:





此弹球游戏还有许多问题,欢迎各位赐教!!




  • 大小: 13.9 KB
1
5
分享到:
评论

相关推荐

    多线程入门,分布式锁,等相关资料

    总结来说,本资源包提供的"多线程入门资料"涵盖了多线程的基本概念、实现方式、线程同步与通信、并发问题及其解决方案,以及分布式锁的原理与实现,是学习Java多线程和分布式系统的好助手。通过深入学习和实践,...

    多线程编程 从入门到精通

    【多线程编程】是计算机领域中的一种编程技术,它允许程序在同一进程中同时运行多个执行单元,即线程。这使得程序能够更高效地利用计算资源,提高并发性和响应速度,尤其是在多核CPU环境下,多线程能实现真正的并行...

    java多线程入门

    ### Java多线程入门知识点详解 #### 多线程背景知识介绍 在计算机科学领域,多线程技术是一项重要的编程技术,它允许程序同时执行多个任务。这种技术极大地提升了程序的执行效率,尤其是在多核处理器普及的今天。...

    Linux系统下的多线程编程入门.pdf

    总结,Linux系统的多线程编程为开发者提供了强大的并发能力,但也带来了挑战。理解和掌握线程创建、同步、通信和问题处理,是编写高效、可靠的多线程程序的基础。通过不断实践和学习,我们可以驾驭这一强大的工具,...

    C++多线程入门[整理].pdf

    C++多线程入门[整理] 在现代计算机系统中,多线程编程是提高系统性能和响应速度的重要手段。C++作为一门面向对象的编程语言,提供了对多线程编程的支持。本文将从基本概念开始,介绍多线程编程的基本概念、线程的...

    多线程的入门 实例源码

    总结来说,多线程编程是提高程序性能和并发能力的关键技术。了解并掌握如何创建线程、控制线程同步、处理线程异常以及优化线程使用,对于任何Java程序员来说都是至关重要的。通过阅读提供的“多线程的入门 实例源码...

    VB.NET 多线程入门的小例子

    总结,VB.NET提供了强大的多线程支持,使得开发者能够充分利用多核处理器的优势,实现高效的并发处理。通过理解并熟练掌握线程的创建、同步和管理,我们可以编写出更健壮、性能更好的应用程序。在实际开发中,应始终...

    java线程入门级书籍

    ### Java线程入门知识点详解 #### 一、Java线程基础知识概述 **1.1 什么是线程?** 线程是程序执行流的最小单元,是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。在Java中...

    关于c++ 多线程入门的文档

    总结起来,C++的多线程编程涉及到线程的创建、状态管理、资源共享以及同步通信。了解这些基础知识后,开发者可以利用多线程提高程序效率,同时应对并发编程带来的挑战。通过使用C++标准库提供的工具,可以编写出高效...

    VC多线程编程入门学习

    ### VC多线程编程入门学习 #### 一、引言 多线程编程是现代软件开发中的重要技术之一,尤其对于提高程序效率和响应性至关重要。本文将介绍如何使用Microsoft Visual C++(简称VC)进行多线程编程,重点讲解在MFC...

    C# 多线程学习入门

    【C# 多线程学习入门】 在当前的云计算时代,多线程技术变得尤为重要,因为它是提升系统性能和响应速度的关键。C#作为一种广泛使用的编程语言,支持强大的多线程处理能力,使得开发者能够充分利用现代多核处理器的...

    MPI教程 多线程编程入门

    ### MPI教程:多线程编程入门 #### 一、引言 消息传递接口(Message Passing Interface,简称MPI)是一种广泛使用的并行计算标准,它允许程序员编写能够在分布式内存架构上运行的应用程序。本文档旨在为初学者提供...

    C#多线程技术入门经典

    【C#多线程技术入门经典】 在C#编程中,多线程技术是一种关键的技能,它允许程序同时执行多个任务,提高了程序的效率和响应性。本篇将逐步介绍C#多线程的基本概念和操作。 1. **线程概述** - 程序的执行通常从...

    C#多线程学习的入门教程

    总结,C#的多线程编程是一项重要技能,能够显著提高程序性能和用户体验。通过理解和熟练运用上述知识点,开发者能够编写出高效、稳定的多线程应用程序。本入门教程将深入浅出地讲解这些概念,并提供实例代码供学习者...

    c#多线程学习入门经典

    在编程领域,尤其是在C#这样的多任务环境里,理解和掌握多线程技术是至关重要...总结来说,C#的多线程编程涵盖了从基本概念到高级特性的广泛内容,理解并熟练掌握这些知识对于编写高效、稳定、安全的并发程序至关重要。

    Ruby多线程编程初步入门

    ### Ruby多线程编程初步入门 #### 一、引言 多线程编程是现代软件开发中的重要组成部分,尤其对于需要高效并发处理的任务而言更是如此。Ruby作为一种灵活且功能强大的编程语言,在支持多线程方面提供了丰富的工具...

    Linux系统下的多线程编程入门

    总结来说,Linux下的多线程编程是一种强大的工具,能够提高程序的性能和响应性,特别是在需要并发处理任务或利用多核处理器优势的场景下。然而,开发多线程程序时必须注意线程安全,合理使用同步机制,避免数据竞争...

    多线程编程的资料(自己收集的)

    - **Linux系统下的多线程编程入门**:适合初学者了解Linux环境下的多线程编程基础知识,包括线程的生命周期、同步机制等。 - **嵌入式Linux多线程编程**:专门针对嵌入式系统的特点介绍了多线程编程的技术要点,包括...

Global site tag (gtag.js) - Google Analytics