`
chenzhaomin
  • 浏览: 10363 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

第十一课时 多线程

    博客分类:
  • Java
 
阅读更多

第十一课时  多线程

要理解多线程,就要从进程的概念开始理解,什么是进程?一个程序就是进程吗?答案是错误的,所谓进程,简单通俗的讲就是一个跑起来

 

的程序。进程需要两个条件,一是程序,二是资源。

那么什么又是进程呢?打个比方,比如我去搬书这件事是一个进程,那么线程就好比人数,人越多,完成的速度也越快。线程就是这样。

其实在早期,计算机是无法实现真正意义上的线程的,因为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;
	}

}

 

 

  • 大小: 16.1 KB
2
4
分享到:
评论
2 楼 chenzhaomin 2013-08-08  
我这里显示正常啊
1 楼 Wonder_234 2013-07-26  
你的图片没出来了

相关推荐

    java语言程序设计1-10章课后答案(代码)

    8. **多线程**: 第10章通常讲解并发编程,包括线程的创建、同步和互斥,以及如何避免死锁。通过练习,你将学会如何编写能充分利用多核处理器的程序。 这些章节的学习将为你打下坚实的Java编程基础。通过分析和运行...

    48课时 java考试题

    - Java中一个类只能继承一个类,但可以实现多个接口。 17. **线程实现方式** - 通过继承`Thread`类。 - 实现`Runnable`接口。 18. **程序错误类型** - 同第10题解析。 19. **逻辑表达式的真假判断** - 同第...

    项目实战_从零打造Linux系统下基于QT的PMP媒体播放器(视频+代码+课件全套价值千元教程)

    8. 媒体播放器项目实战之三:多线程 9. 媒体播放器项目实战之四:多进程与进程间通信 10. 媒体播放器项目实战之五:项目整合及测试 第三部分:QT系统移植 11. madplay交叉编译与系统移植 12. QT交叉编译与系统移植 ...

    python与数据分析的课程报告-七月在线-Python数据分析升级版-课程总结.pdf

    第八、九、十课时分别涉及社交网络分析、Python的多线程和深度学习。社交网络分析探讨如何处理和分析社交平台上的数据,理解用户行为模式。多线程是Python中处理并发任务的方式,让程序能够同时执行多个任务,提高...

    《python》课程教学大纲.doc.doc

    * 第十一章:多线程及多进程编程 * 第十二章:网络编程 * 第十三章:数据库编程 * 第十四章:NumPy 模块 * 第十五章:pandas 模块 使用教材及主要参考书目: * 选用教材:自编 * 主要参考书目:SHAW Z A. 《笨办法...

    AIC的Java课程1-6章

    第11章 集合 4课时  理解什么是集合以及Java的集合框架。  辨析List,Set和Map接口。 • 理解List接口,辨别使用List接口的实现类。 • 理解Set接口,辨别使用Set接口的实现类。...

    Java程序设计(新) 《JAVA程序设计》_整体设计.doc

    课程内容涵盖了面向对象技术的发展历史、Java基本数据类型和运算符、控制语句、类与对象、封装、继承、多态、接口、异常处理、Swing组件、文件操作、多线程技术、网络通信和数据库连接等多个方面。 知识目标: 1. ...

    iOS课程大纲

    - 套接字编程、推送技术、多线程编程等。 - **C08:JSON与XML** - JSON与XML格式的数据解析方法。 - **C09:手势与触摸** - 手势识别、单点触摸与多点触摸的处理。 - 点击与滑动事件的捕捉与响应。 - **...

    android源码开发实战14.07.zip

    8. **多线程与并发**:Android应用开发中多线程处理是常见需求,理解Looper、Handler和线程池等机制可以优化应用性能。 9. **UI绘制流程**:从布局解析到视图绘制,深入源码可以优化UI性能,例如通过自定义View来...

    易语言1-30课教程

    ##### (二)进阶篇(第11-20课) 1. **文件操作**: - 文件读写:学习如何打开文件、读取文件内容以及写入文件。 - 文件格式:处理不同格式的文件,如文本文件、CSV文件等。 2. **数据库交互**: - 数据库连接...

    shangxuetang python.zip

    9. 多线程与并发:了解线程和进程,以及如何在Python中实现并发执行。 10. GUI编程:使用tkinter或其他库创建图形用户界面。 11. 数据库操作:连接数据库,执行SQL查询,使用ORM框架如sqlite3等。 12. Web开发:学习...

    mars视频教程第一季源代码

    你将学习AsyncTask、Handler、Looper、Runnable、Thread等多线程技术。 8. **网络编程**:Android应用通常需要与服务器进行数据交换。源码可能涉及使用HttpURLConnection、OkHttp或Retrofit等库进行网络请求。 9. ...

    Java实用培训资料pdf

    7. **多线程**:Java内置对多线程的支持,学习如何创建和管理线程,理解同步和互斥的概念,以及使用synchronized关键字和Lock接口,是提高程序效率的关键。 8. **网络编程**:Java的Socket编程允许开发者创建网络...

    java初学者完整代码+注释3

    11. **多线程**:Java内置对多线程的支持,可以通过实现Runnable接口或继承Thread类来创建线程。 12. **接口与抽象类**:接口是完全抽象的,只能包含常量和抽象方法,而抽象类可以有非抽象方法。它们用于实现不同...

    JB_25_Lesson_09

    【Java编程二十五课:第九讲】 本课时主要聚焦于Java编程语言的深入学习,特别是针对Java中的核心概念和技术进行讲解。"JB_25_Lesson_09"可能涵盖了许多关键主题,包括但不限于类、对象、封装、继承、多态性等面向...

Global site tag (gtag.js) - Google Analytics