第十一课时 多线程
要理解多线程,就要从进程的概念开始理解,什么是进程?一个程序就是进程吗?答案是错误的,所谓进程,简单通俗的讲就是一个跑起来
的程序。进程需要两个条件,一是程序,二是资源。
那么什么又是进程呢?打个比方,比如我去搬书这件事是一个进程,那么线程就好比人数,人越多,完成的速度也越快。线程就是这样。
其实在早期,计算机是无法实现真正意义上的线程的,因为cpu只有一个,一次也只能执行一行代码。所以程序员就把代码分成一个个时间片
,cup就不断地从这代码上切换,由于切换速度很快,就给人造成一种假象,好像同时在完成,其实不是,如今的硬件已经可以实现真正意义
上的线程了。(注意一点,每个进程至少有一个线程)
java中多线程的实现:
java不像c或c++那样使用线程还需要调用系统api那样麻烦,java只要继承Thread或者实现Runnable接口,就能启动线程
public class Test1() extends Thread{
public static void main(String[] args){
Test1 test = new Test1();
test.start();//不用自己调用run方法,只要启动线程,系统会自己调用
}
public void run(){
.....
}
}
public class Test2() implements Runnable{
public static void main(String[] args){
Test2 test = new Test1();
Thread thread = new Thread(test);
thread.start();
}
public void run(){
.....
}
}
注意一点,线程的确是能够快速提高效率,但是也难以控制,就像开车一样,速度越快,事故发生的可能就越大,所以如果在计算比较精确
的数值时,如果线程不太会用的话,那就不要用了
实例:两小球的碰撞与边界的碰撞,本例只实现了两个小球的碰撞,如果想实现多个小球的碰撞有两个方法,第一是在paint()方法里调用
小球的碰撞方法,第二是再写一个碰撞类,一个碰撞一个线程,这里我就不演示了,有兴趣的同学自己试一下。
package cn.czm0725线程; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.JFrame; /** * 窗体类 * @author ChenZhaoMin * */ public class BallFrame extends JFrame{ private Ball ball; private Ball ball2; /** * @param args */ public static void main(String[] args) { BallFrame bf = new BallFrame(); bf.initUI(); } public void initUI(){ this.setTitle("小球碰撞"); this.setSize(600,600); this.setResizable(false); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(3); this.setVisible(true); ball = new Ball(this,Color.RED,20,30,30,95); Thread t1 = new Thread(ball); t1.start(); ball2 = new Ball(this,Color.BLUE,500,500,30,315); Thread t2 = new Thread(ball2); t2.start(); ball.setB(ball2); ball2.setB(ball); } public void paint(Graphics g){ super.paint(g); Graphics2D g2= (Graphics2D)g; //ball.collide(ball2);调用碰撞也可以实现 g2.setColor(ball.getC()); ball.setFrame(ball.getX(), ball.getY(), ball.getDiameter(), ball.getDiameter()); g2.fill(ball); g2.setColor(ball2.getC()); ball2.setFrame(ball2.getX(), ball2.getY(), ball2.getDiameter(), ball2.getDiameter()); g2.fill(ball2); } }
package cn.czm0725线程; import java.awt.Color; import java.awt.geom.Ellipse2D; /** * 小球类 * @author ChenZhaoMin * */ public class Ball extends Ellipse2D.Double implements Runnable { private BallFrame bf; private Color c; private double x, y, diameter; private double speed = 2; private int alpha;//与竖向顺时针夹角 private Ball b; public Ball(BallFrame bf, Color c, double x, double y, int diameter,int alpha) { this.bf = bf; this.c = c; this.x = x; this.y = y; this.diameter = diameter; this.alpha=alpha; } /** * 重写run方法 */ public void run() { while (true) { move(); collide(b); bf.repaint(); try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 小球的方法(包括与边界的碰撞) */ public void move() { x += speed * Math.sin(alpha * Math.PI / 180); y -= speed * Math.cos(alpha * Math.PI / 180); if (x < 15 || x > 570) alpha = 360 - alpha; if (y < 30 || y > 560) alpha = 180 - alpha; } /** * 小球碰撞的方法 * @param b所要碰撞的小球 */ public void collide(Ball b){ if(Math.sqrt(Math.pow((this.x-b.x),2)+Math.pow((this.y-b.y),2))<(this.diameter/2+b.diameter/2)){ if(Math.sin(this.alpha*Math.PI/180)>0){ this.alpha=this.alpha+180; }else{ this.alpha=this.alpha-180; } if(Math.sin(b.alpha*Math.PI/180)>0){ b.alpha=b.alpha+180; }else{ b.alpha=b.alpha-180; } } } public Color getC() { return c; } public double getX() { return x; } public double getY() { return y; } public double getDiameter() { return diameter; } public void setB(Ball b) { this.b = b; } }
相关推荐
8. **多线程**: 第10章通常讲解并发编程,包括线程的创建、同步和互斥,以及如何避免死锁。通过练习,你将学会如何编写能充分利用多核处理器的程序。 这些章节的学习将为你打下坚实的Java编程基础。通过分析和运行...
- Java中一个类只能继承一个类,但可以实现多个接口。 17. **线程实现方式** - 通过继承`Thread`类。 - 实现`Runnable`接口。 18. **程序错误类型** - 同第10题解析。 19. **逻辑表达式的真假判断** - 同第...
8. 媒体播放器项目实战之三:多线程 9. 媒体播放器项目实战之四:多进程与进程间通信 10. 媒体播放器项目实战之五:项目整合及测试 第三部分:QT系统移植 11. madplay交叉编译与系统移植 12. QT交叉编译与系统移植 ...
第八、九、十课时分别涉及社交网络分析、Python的多线程和深度学习。社交网络分析探讨如何处理和分析社交平台上的数据,理解用户行为模式。多线程是Python中处理并发任务的方式,让程序能够同时执行多个任务,提高...
* 第十一章:多线程及多进程编程 * 第十二章:网络编程 * 第十三章:数据库编程 * 第十四章:NumPy 模块 * 第十五章:pandas 模块 使用教材及主要参考书目: * 选用教材:自编 * 主要参考书目:SHAW Z A. 《笨办法...
第11章 集合 4课时 理解什么是集合以及Java的集合框架。 辨析List,Set和Map接口。 • 理解List接口,辨别使用List接口的实现类。 • 理解Set接口,辨别使用Set接口的实现类。...
课程内容涵盖了面向对象技术的发展历史、Java基本数据类型和运算符、控制语句、类与对象、封装、继承、多态、接口、异常处理、Swing组件、文件操作、多线程技术、网络通信和数据库连接等多个方面。 知识目标: 1. ...
- 套接字编程、推送技术、多线程编程等。 - **C08:JSON与XML** - JSON与XML格式的数据解析方法。 - **C09:手势与触摸** - 手势识别、单点触摸与多点触摸的处理。 - 点击与滑动事件的捕捉与响应。 - **...
8. **多线程与并发**:Android应用开发中多线程处理是常见需求,理解Looper、Handler和线程池等机制可以优化应用性能。 9. **UI绘制流程**:从布局解析到视图绘制,深入源码可以优化UI性能,例如通过自定义View来...
##### (二)进阶篇(第11-20课) 1. **文件操作**: - 文件读写:学习如何打开文件、读取文件内容以及写入文件。 - 文件格式:处理不同格式的文件,如文本文件、CSV文件等。 2. **数据库交互**: - 数据库连接...
9. 多线程与并发:了解线程和进程,以及如何在Python中实现并发执行。 10. GUI编程:使用tkinter或其他库创建图形用户界面。 11. 数据库操作:连接数据库,执行SQL查询,使用ORM框架如sqlite3等。 12. Web开发:学习...
你将学习AsyncTask、Handler、Looper、Runnable、Thread等多线程技术。 8. **网络编程**:Android应用通常需要与服务器进行数据交换。源码可能涉及使用HttpURLConnection、OkHttp或Retrofit等库进行网络请求。 9. ...
7. **多线程**:Java内置对多线程的支持,学习如何创建和管理线程,理解同步和互斥的概念,以及使用synchronized关键字和Lock接口,是提高程序效率的关键。 8. **网络编程**:Java的Socket编程允许开发者创建网络...
11. **多线程**:Java内置对多线程的支持,可以通过实现Runnable接口或继承Thread类来创建线程。 12. **接口与抽象类**:接口是完全抽象的,只能包含常量和抽象方法,而抽象类可以有非抽象方法。它们用于实现不同...
【Java编程二十五课:第九讲】 本课时主要聚焦于Java编程语言的深入学习,特别是针对Java中的核心概念和技术进行讲解。"JB_25_Lesson_09"可能涵盖了许多关键主题,包括但不限于类、对象、封装、继承、多态性等面向...