`
剑&箫
  • 浏览: 53056 次
  • 性别: 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
分享到:
评论

相关推荐

    多线程与socket网络编程-内附视频链接-新手入门资料

    新手入门多线程与socket网络编程资料,个人知识点总结

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

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

    socket linux c++ 多线程3

    最近几个月总结和网上收集资料第三套:c语言Socket编程多线程编程入门指导Socket编程Thread_多线程Linux下的多线程编程等10多个资料....

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

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

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

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

    C#线程入门教程之单线程介绍

    多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。 个人总结 在C#中我们开启一个应用程序就是打开了一个...

    C++转JAVA入门总结

    1. 内置数据类型 2. string类 3. 数组 4. 循环分支 5. 工具类(数据容器、日期、正则表达式……) 6. JAVA流、文件、IO 7. JAVA异常 8. JAVA继承 1. 抽象类与抽象方法 ...5.JAVA网络与多线程 6. JAVA类生命周期

    Python实现多线程爬虫

    其实网络上已经有很多基于Python的入门爬虫程序了,所以学习起来比较方便,唯独那个多线程爬虫一直都学的不是很明白,所以就写下这篇blog记录一下学到的一些东西(主要是对自己所学的一些东西进行整理和总结)。...

    java中终止一个线程的方法总结(精)

    如果你也这么认为,那你对多线程编程还没有入门。  在java中,线程的中断(interrupt)只是改变了线程的中断状态,至于这个中断状态改变后带来的结果,那是无法确定的,有时它更是让停止中的线程继续执行的唯一手段...

    自己总结的多线程的相关知识的思维导图

    javase 刚入门人群

    java 编程入门思考

    1.9 多线程 1.10 永久性 1.11 Java和因特网 1.11.1 什么是Web? 1.11.2 客户端编程 1.11.3 服务器端编程 1.11.4 一个独立的领域:应用程序 1.12 分析和设计 1.12.1 不要迷失 1.12.2 阶段0:拟出一个计划 1.12.3 阶段...

    Java从入门到精通.pdf

    十四万字总结,PDF包含了十四个大模块:Java基础知识,数据结构,算法,Java集合框架,Java8新特性,操作系统,网络原理,Java多线程及并发编程,Java的IO模型及网络编程,JVM,Mysql,JavaWeb和一个仿Tomcat实现的...

    Java初学者入门教学

    1.9 多线程 1.10 永久性 1.11 Java和因特网 1.11.1 什么是Web? 1.11.2 客户端编程 1.11.3 服务器端编程 1.11.4 一个独立的领域:应用程序 1.12 分析和设计 1.12.1 不要迷失 1.12.2 阶段0:拟出一个计划 1.12.3 阶段...

    C#开发常见问题清单总结与入门常见问题.docx

    4. 并发与多线程编程 技巧10:线程同步与并发控制 技巧11:避免死锁的策略与设计模式 技巧12:线程安全编程与锁机制的正确使用 5. .NET框架高级特性 技巧13:LINQ查询表达式的高效运用 技巧14:Lambda表达式与委托...

    Python从入门到精通-第三章-简单循环

    在进阶篇中,课程内容更加深入,主要讲解了Python编程中的高级特性,包括面向对象编程、多线程编程、网络编程、Web开发等;在实战篇中,课程通过一些具体的实例和项目,帮助学员将所学的Python知识应用到实际编程中...

    Python从入门到精通-第二章-数值运算

    在进阶篇中,课程内容更加深入,主要讲解了Python编程中的高级特性,包括面向对象编程、多线程编程、网络编程、Web开发等;在实战篇中,课程通过一些具体的实例和项目,帮助学员将所学的Python知识应用到实际编程中...

    Python从入门到精通-第一章-人机交互

    在进阶篇中,课程内容更加深入,主要讲解了Python编程中的高级特性,包括面向对象编程、多线程编程、网络编程、Web开发等;在实战篇中,课程通过一些具体的实例和项目,帮助学员将所学的Python知识应用到实际编程中...

    Python从入门到精通-第五章-流程控制.zip

    在进阶篇中,课程内容更加深入,主要讲解了Python编程中的高级特性,包括面向对象编程、多线程编程、网络编程、Web开发等;在实战篇中,课程通过一些具体的实例和项目,帮助学员将所学的Python知识应用到实际编程中...

    Python从入门到精通-第四章-简单分支.zip

    在进阶篇中,课程内容更加深入,主要讲解了Python编程中的高级特性,包括面向对象编程、多线程编程、网络编程、Web开发等;在实战篇中,课程通过一些具体的实例和项目,帮助学员将所学的Python知识应用到实际编程中...

    2023年最新c#入门介绍.md

    C#拥有许多强大的编程功能,如布尔条件、自动垃圾回收、标准库、组件版本管理、属性和事件、委托和事件管理、泛型、索引器、条件编译、多线程、LINQ和Lambda表达式等。 C#具有与Java非常相似的语法和编程风格,但在...

Global site tag (gtag.js) - Google Analytics