`
剑&箫
  • 浏览: 53565 次
  • 性别: 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多线程和分布式系统的好助手。通过深入学习和实践,...

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

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

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

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

    多线程的入门 实例源码

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

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

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

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

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

    C# 多线程学习入门

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

    C#多线程技术入门经典

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

    VC 多线程编程入门解释和实例

    《VC 多线程编程入门解释与实例》 在Windows应用程序开发中,多线程编程是一种重要的技术,它能够提高程序的效率,特别是在处理耗时任务时,避免程序出现阻塞,提高用户体验。本文将从一个问题出发,引出多线程的...

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

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

    C++多线程编程入门小结

    一个c++开发技巧合集,也是大家多线程编程入门的总结。初学多线程编程的童鞋可以看看。

    MFC多线程编程实例三个

    总结,MFC多线程编程实例三个展示了如何利用MFC库创建和管理多个线程,特别是在Tab控件的环境中。每个实例都可能包含如何初始化线程、启动Dialog、传递参数以及处理线程同步的代码,这对于理解和实践MFC的多线程编程...

    多线程编程的入门指导.zip

    总结,多线程编程是现代软件开发中的重要技术,理解和掌握多线程的基本概念、实现方式、同步与通信机制,以及如何处理并发问题,对于编写高效、稳定的应用至关重要。通过深入学习和实践,开发者可以更好地利用系统...

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

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

    Windows多线程编程入门讲解.pdf

    总结来说,Windows多线程编程涉及到线程创建、管理、同步和资源共享等多个方面。开发者需要理解线程的基本概念和行为,熟练掌握Win32 API或MFC提供的工具,才能编写出高效、稳定的多线程应用程序。在实际编程中,...

    个人总结的深入java多线程开发

    看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...

    c++多线程安全的消息队列模板

    在C++编程中,多线程安全的消息队列...8. **总结**:C++多线程安全的消息队列模板是并发编程中的重要工具,它提供了线程间的高效通信和同步。通过理解和应用这些概念,开发者可以创建出更强大、更健壮的多线程程序。

    C++多线程编程资料(容易理解)

    整合了对C++多线程入门的总结和一些个人的理解,附加上具体实例,容易理解,是学习多线程编程的很好资料

    多线程

    5. **Java多线程介绍.pdf** 可能会提供一个多线程的入门介绍,解释基本概念并给出简单的示例。 6. **Java线程和IO总结.pdf** 结合了线程与输入/输出(I/O)的概念,可能讲述了在多线程环境下如何处理I/O操作,如...

Global site tag (gtag.js) - Google Analytics