`

多线程小结

 
阅读更多
一、程序、进程、线程
程序:静态的代码
进程:程序运行的过程
线程:比进程更小的执行单位,多线程给人一种多个事件同时发生的感觉(其实这是错觉)。

二、实现多线程常用的方法
1、继承Thread    2、实现Runnable接口
无论使用这两种方法中的哪个,都要重写(或实现)run()方法,目的是规定线程的具体操作。
而调用线程具体操作时是要调用start()方法,并不是run()方法。
通过继承Thread实现多线程时,可以直接用Thread对象调用start()方法;
通过实现Runnable接口实现多线程时,仍然要用到Thread类
如下,ThreadTest和RunnableTest两个类中重写的run()方法的具体操作一样,一下两种实现多线程的方式得到的结果是一样的
public static void main(String[] args){
		ThreadTest thread1 = new ThreadTest();
		thread1.setName("thread1");
		thread1.start();
		ThreadTest thread2 = new ThreadTest();
		thread2.setName("thread2");
		thread2.start();
	}

public static void main(String[] args) {
		RunnableTest runnable1 = new RunnableTest();
        Thread thread1 = new Thread(runnable1);
        thread1.setName("thread1");
        thread1.start();
        RunnableTest runnable2 = new RunnableTest();
        Thread thread2= new Thread(runnable2);
        thread2.setName("thread2");
        thread2.start();
	}

三、多线程与并行
多线程即为多个进程共享资源,多个线程排队等候使用CPU,但因为线程间转换的时间很短,所以像是多个线程并列独自运行。
并行则是有多个CPU,由少于CPU个数的多个进程使用,此时是多个进程真正意义上的同时进行。
比如一个人左右手都能写字,如果先用右手写一会儿,再用左手写,这样两手交替着写的话,就叫多线程;而如果两只手同时下笔,左手画圆,右手画方,这就是并行。

四、多线程应用
1.弹球
功能介绍:通过点击按钮,添加小球、使指定小球停止、删除,同时可以直接单击小球使其停止,双击小球进行删除。

在实现这个弹球程序的过程中,我遇到过以下问题,想和大家分享一下:
a.彩色背景下的重绘
如果背景是纯色的,要实现小球移动会比较容易,只要每次用一个背景色的小球填充原来的位置即可,可是如果背景是副图片的画,自然不能再画一个小圆来填充了。对此,我从老师那里学到了一个新的类BufferedImage,可以把每个时刻窗体显示出的画面都保存在BufferedImage中,再以整幅图片的形式在窗体中重绘出来。

public void run(){
		while(true){
			try {
				Thread.sleep(100);
				BufferedImage bi = new BufferedImage(800,620,BufferedImage.TYPE_3BYTE_BGR);
				Graphics g=bi.getGraphics();
				ImageIcon image = new ImageIcon("images/threadBg.jpg");
				g.drawImage(image.getImage(), 0, 0, null);
				for(int i=0; i<threadList.size();i++){
					BallThread thread = threadList.get(i);
					thread.drawBall(g);
				  }
				panel.getGraphics().drawImage(bi, 0, 0, panel.getWidth(), panel.getHeight(), null);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

b.小球碰撞后方向的改变,首先是要计算小球圆形间的距离,一旦小于等于它们半径的和,就开始改变方向。但这个方向改变时,应该从相撞时的上一个位置开始就改变方向,否则两个小球就会不停地来回晃动,虽一直打架,却始终都分不开。
/**
	 * if the balls meet,change their state
	 * @param dd
	 * @return
	 */
	public boolean collision(){
		for(BallThread com : threadList){
			if(this.getId() == com.getId())
				continue;
			int x_oth = com.getX();
			int y_oth = com.getY();
			int r_oth = com.getR();
			int distance=(int) Math.hypot((double)Math.abs(x_oth+r_oth-x-r),(double) Math.abs(y_oth+r_oth-y-r));
			if(distance<=r_oth+r && distance>0){
				return true;
			}
		}
		return false;
	}
	
	/**
	 * change the ball's direction and speed according to its position
	 */
	public void move(){
		if(xdirection==RIGHT){
			x+=xspeed;
			if(collision()){
				this.x_convert();
				x-=xspeed;
			}
		}else if(xdirection==LEFT){
			x-=xspeed;
			if(collision()){
				this.x_convert();
				x+=xspeed;
			}
		}
		if(ydirection==UP){
			y-=yspeed;
			if(collision()){
				this.y_convert();
				y+=yspeed;
			}
		}else if(ydirection==DOWN){
			y+=yspeed;
			if(collision()){
				this.y_convert();
				y-=yspeed;
			}
		}
	}

c.小球的停止和删除,通过设置布尔型的属性,来控制线程的运行
public void run(){
		initCharacter();
		while(true){
			try {
				sleep(100);
				if(delete){//删除
					return;
				}
				if(pause){//停止
					System.out.println("pause="+this.pause);
					continue;
				}
				move();//运动
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

2.端口扫描器
通过设置不同数目的线程共同检查端口是否可用,以比较搜索的快慢。搜索的基本方法是看Socket socket = new Socket(ip,i);是否抛出异常,如果抛出异常,则该端口i不能用。



  • 大小: 102.8 KB
  • 大小: 42.3 KB
分享到:
评论
1 楼 jiranjiran 2013-07-24  

相关推荐

    Java多线程小结

    ### Java多线程小结 #### 一、多线程的概念与意义 多线程是Java编程中的一个重要概念,指的是程序在运行时可以同时执行多个线程的能力。它能够提高程序的性能,尤其是在多核处理器的环境下。多线程使得程序能够更...

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

    根据给定文件信息,以下是对"C++多线程编程入门小结.pdf"文件内容的知识点说明: ### 知识点一:C++多线程编程基础 C++多线程编程是指在C++程序中同时执行多个线程,以利用现代处理器的多核能力,提高程序的执行...

    Linux编程技术-实验4 多线程编程.doc

    Linux多线程编程技术 本实验报告的主要内容是关于...五、疑难小结: 本实验中遇到的困难是对共享变量的使用和理解不够深入,对消费者和生产者代码的编写还不是太熟练。需要更多地查询资料和实践来提高自己的技术。

    VC++多线程与网络

    #### 小结 掌握VC++下的多线程与网络编程技巧对于开发高性能、高并发的网络应用程序至关重要。通过深入理解进程与线程的概念,熟练运用`CreateProcess()`和`CreateThread()`等API,以及掌握Winsock网络编程技术,...

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

    ### C++多线程编程入门知识点详解 #### 一、线程与进程概念解析 - **进程**: 进程是程序执行的一个实例。在Win32环境下,每个进程都有一个4GB的地址空间,用于存储应用程序的代码和数据。进程本身不执行任何指令,...

    操作系统-创建多线程-读者写者

    #### 小结 本文通过对一个简单的多线程程序的分析,介绍了如何在Windows环境中使用`CreateThread`函数创建线程,并简要探讨了生产者-消费者模式和读者写者问题。在实际开发中,还需要深入研究多线程同步机制,以确保...

    Python程序设计:多线程爬虫.pptx

    ### 小结 理解进程与线程的概念,掌握Python的`threading`模块,以及如何在爬虫中运用多线程,是提高爬虫效率的关键。在编写多线程爬虫时,需要注意线程安全问题,合理利用锁和其他同步机制,以确保数据一致性。...

    多线程编程一个简单示例轻松入门

    #### 小结 本文通过一个简单的示例介绍了多线程编程的基础知识及如何使用`CreateThread()`函数创建线程。通过这个示例,读者可以了解到线程的基本创建流程、参数传递方式以及如何与主线程进行交互。多线程编程是...

    VC++多线程编程

    #### 六、小结 通过本文的学习,我们了解了VC++环境下多线程编程的基础知识和技术要点。多线程编程虽然能显著提高程序性能,但也存在诸多挑战,如资源竞争和线程安全等问题。因此,在实际开发中需要结合具体场景...

    C#多线程教程

    #### 小结 C#中的多线程技术为开发高性能和响应性的应用程序提供了强大的支持。通过合理利用多线程机制,开发者可以有效地提高程序的并发性和资源利用率,同时确保程序的稳定性和安全性。上述内容涵盖了多线程的...

    mfc 多线程编程

    #### 七、小结 本文介绍了MFC环境下多线程编程的基础知识,包括进程与线程的概念、Win32 API对多线程的支持以及MFC中的多线程实现方法。通过具体的实例,读者可以了解到如何创建线程、线程间的同步以及如何利用MFC...

    多线程编程指南(系统描述了线程标准 线程同步 多线程编程原则 等)

    1 多线程基础介绍15 定义多线程术语15 符合多线程标准16 多线程的益处17 提高应用程序的响应 17 有效使用多处理器17 改进程序结构17 占用较少的系统资源17 结合线程和RPC(远程过程调用)18 多线程概念18 并发性和...

    java多线程设计模式

    #### 四、小结 Java多线程设计模式是Java并发编程的重要组成部分,能够有效地帮助开发者解决多线程环境下的各种问题,提高程序的性能和稳定性。理解并掌握这些模式对于编写高效、可靠的多线程应用程序至关重要。

    Linux多线程服务端编程:使用muduo C++网络库

    1.13心得与小结. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . 26 1.14Observer 之谬. . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 第2章线程同步精要 2.1互斥器...

    Java编程中多线程总结

    #### 九、小结 Java多线程是一个庞大且复杂的主题,涉及线程的创建、调度、同步等多个方面。通过深入理解上述知识点,开发者能够更好地利用Java的多线程特性来构建高性能、高并发的应用程序。此外,Java 5及其后续...

    用多线程同步方法解决生产者-消费者问题

    5. **设计小结与心得** - 总结设计过程中的挑战和解决方案,比如如何有效地实现线程同步,如何避免死锁,以及如何优化性能。 - 分享从项目中学到的知识和经验,可能包括多线程编程的技巧、并发控制的理解以及调试...

    c#中多线程访问winform控件的若干问题小结

    我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来解决这个问题,下面我将详细的介绍。 首先来看传统方法: 代码如下:public partial class Form1 ...

    Java线程类小结(附思维导图)

    - **线程安全的集合类**:如`ConcurrentHashMap`、`CopyOnWriteArrayList`等,设计用于多线程环境。 - **原子类(Atomic*)**:如`AtomicInteger`、`AtomicLong`,提供原子操作,常用于实现无锁编程。 7. **线程...

Global site tag (gtag.js) - Google Analytics