`
齐在
  • 浏览: 11794 次
社区版块
存档分类
最新评论

线程总结

阅读更多

1、线程是什么

线程可以理解为程序内部一个独立的运行单位。以QQ为例,QQ是一个进程,一个应用程序就是一个进程,进程下面有很多线程线程就是进程内部的多个运行单位。

2、多线程应用

我们以前写的JAVA程序就是一个单线程程序,我们只能按照程序自顶而下地进行,比如我们在一个Button上添加监听机制,我们只有在监听机制的程序运行完之后我们才能进行下一步动作。这时候我们可以测试一下,当我们在监听机制中循环输出一万次,我们可以很明显地看到按钮按下去没有起来,我们也无法进行其他动作。 这个时候,我们就需要多线程的应用了,多线程应用可以让我们同时干很多件事情。

3、实现线程

线程需要继承Thread类重写run()方法或者是实现Runnable接口。线程是通过调用线程对象的start()方法来启动,它的运行是从run()开始,

4、实现线程的方法

1)重写run()方法

这是目前我们用得最多的方法,我们只需要创建一个类来继承Thread类,重写它的run()方法,然后在主线程里面我们来创建这一个类的对象,最后调用它的start()方法。

2)实现Runnable 接口

创建一个Runnable的对象,然后传入我们新构造的Thread对象,最后start

3)通过匿名内部类来实现

创建Runnable对象的同时重写它的run()方法,最后也是传入我们构造Thread对象。在一个方法调用中就可以启动我们的线程,而且这个线程还可以直接调用类中的属性和方法,但要注意的是,在方法中启动匿名内部类线程时,如果向run方法传递参数,必须定义为final类型

下面是弹球的线程代码:

public interface Info {
	int FW0 = 0;
	int FH0 = 0;
	int WIDTH = 1500;
	int FHEIGHT = 1000;
	int NHEIGHT = 50;
	int CHEIGHT = 550;
	int BT_WIDTH = 80;
	int BT_HEIGTH = 30;
}

 

 

 

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.JPanel;

public class Ball extends Thread implements Info {
	private JPanel cpanel;
	private Graphics g;
	private int startX, startY;
	private int x, y;
	private int vx, vy;
	private int r;
	private Color color;
	public boolean flag_pause = false;
	public boolean flag_stop = false;
	private int red, green, blue;
	private ArrayList list;

	public Ball(JPanel cpanel, ArrayList list, Graphics g) {
		this.cpanel = cpanel;
		this.list = list;
		this.g = g;
		((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,
				RenderingHints.VALUE_ANTIALIAS_ON);
		getinfo();
	}

	public void setflag_pause(boolean flag) {
		this.flag_pause = flag;
	}

	public void setflag_stop(boolean flag) {
		this.flag_stop = flag;
	}

	public void run() {
		while (true) {
			try {
				Thread.sleep(20);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			if (flag_stop == true) {
				break;
			}
			if (flag_pause == true) {
				continue;
			}
		}
	}

	// 得到初始点横坐标,纵坐标,和纵向速度,横向速度,以及颜色
	public void getinfo() {
		Random random = new Random();
		r = 10 + random.nextInt(30);
		startX = random.nextInt(cpanel.getWidth() - r * 2);
		startY = random.nextInt(cpanel.getHeight() - r * 2);
		vx = 5 + random.nextInt(3);
		vy = 4 + random.nextInt(3);
		red = random.nextInt(255);
		green = random.nextInt(255);
		blue = random.nextInt(255);
		color = new Color(red, green, blue);
		x = startX;
		y = startY;
	}

	// 小球运动的方法
	public void gameway() {
		if (x <= 0 || x >= cpanel.getWidth() - r * 2)
			vx = -vx;
		if (y <= 0 || y >= cpanel.getHeight() - r * 2)
			vy = -vy;
		double length_x, length_y, length;
		// 碰撞的时候
		for (int i = 0; i < list.size(); i++) {
			Ball ball = (Ball) list.get(i);
			if (ball != this) {
				length_x = Math.abs(this.x + this.r - (ball.x + ball.r));
				length_y = Math.abs(this.y + this.r - (ball.y + ball.r));
				length = Math.sqrt(length_x * length_x + length_y * length_y);
				if (length <= ball.r + this.r) {
					this.x = this.x - this.vx;
					this.y = this.y - this.vy;
					this.vx = -vx;
					this.vy = -vy;
				}
			}
		}
	}

	// 得到小球的颜色
	public void drawball(int a, int b, Graphics g2) {
		int xx = a, yy = b, rr = r, redd = red, greenn = green, bluee = blue;
		for (int i = 0; i < 20; i++) {
			redd += 4;
			greenn += 4;
			bluee += 4;
			if (redd > 255)
				redd = 255;
			if (greenn > 255)
				greenn = 255;
			if (bluee > 255)
				bluee = 255;
			g2.setColor(new Color(redd, greenn, bluee));
			g2.fillOval(xx, yy, rr * 2, rr * 2);
			if (rr > 1)
				rr -= 1;
			if (xx + rr < x + r)
				xx += 1;
		}
	}

	public void draw(Graphics g2, boolean flag) {
		gameway();
		if (flag) {
			x += vx;
			y += vy;
		}
		drawball(x, y, g2);
	}
}

 

 

 

 

 

 

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.util.ArrayList;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class XCFrame implements Info {
	private JFrame jframe;
	private JPanel npanel;
	private JPanel cpanel;
	public Graphics g, g2;
	private boolean flag_pause, flag_stop;

	private ArrayList<Ball> list = new ArrayList<Ball>();

	public static void main(String[] args) {
		XCFrame xcframe = new XCFrame();
		xcframe.show();
	}

	public void show() {
		jframe = new JFrame();
		jframe.setTitle("我们做了很多小球!");
		jframe.setDefaultCloseOperation(3);
		jframe.setBounds(FW0, FW0, WIDTH, FHEIGHT);
		Npanel();
		Cpanel();
		jframe.setVisible(true);
		ImageIcon icon = new ImageIcon("png/秦时明月.jpg");
		g = cpanel.getGraphics();
		int x = 0, y = 0;
		while (true) {
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			BufferedImage buffer = new BufferedImage(cpanel.getWidth(),
					cpanel.getHeight(), BufferedImage.TYPE_INT_RGB);
			g2 = buffer.getGraphics();
			g2.drawImage(icon.getImage(), x, y, null);
			x--;
			g2.drawImage(icon.getImage(), (x + buffer.getWidth()), y, null);
			if (x + buffer.getWidth() < 0)
				x = 0;

			for (int i = 0; i < list.size(); i++) {
				Ball ball = list.get(i);
				if (ball.flag_stop)
					list.remove(i);
				System.out.println("size is " + list.size());
				if (!ball.flag_pause)
					ball.draw(g2,true);
				else ball.draw(g2,false);
			}
			g.drawImage(buffer, 0, 0, null);
		}

	}

	// 北边的按钮面板
	public void Npanel() {
		npanel = new JPanel();
		npanel.setBackground(Color.BLACK);
		npanel.setPreferredSize(new Dimension(jframe.getWidth(), NHEIGHT));
		jframe.add(npanel, BorderLayout.NORTH);
		add_button();
	}

	// 小球运动的面板
	public void Cpanel() {
		cpanel = new JPanel();
		cpanel.setBackground(Color.white);
		jframe.add(cpanel, BorderLayout.CENTER);
	}

	// 添加按钮的方法
	public void add_button() {
		// 添加按钮
		JButton jbt_add = new JButton("add");
		jbt_add.setPreferredSize(new Dimension(BT_WIDTH, BT_HEIGTH));
		jbt_add.addActionListener(l);
		npanel.add(jbt_add);

		JButton jbt_pause = new JButton("pause");
		jbt_pause.setPreferredSize(new Dimension(BT_WIDTH, BT_HEIGTH));
		jbt_pause.addActionListener(l);
		npanel.add(jbt_pause);

		JButton jbt_move = new JButton("move");
		jbt_move.setPreferredSize(new Dimension(BT_WIDTH, BT_HEIGTH));
		jbt_move.addActionListener(l);
		npanel.add(jbt_move);

		JButton jbt_remove = new JButton("remove");
		jbt_remove.setPreferredSize(new Dimension(BT_WIDTH, BT_HEIGTH));
		jbt_remove.addActionListener(l);
		npanel.add(jbt_remove);
	}

	ActionListener l = new ActionListener() {
		public void actionPerformed(ActionEvent e) {

			String choose = e.getActionCommand();
			Ball ball = new Ball(cpanel, list, g2);
			if (choose.equals("add")) {
				list.add(ball);
				ball.start();
			}
			if (choose.equals("pause")) {
				for (int i = 0; i < list.size(); i++) {
					Ball b = list.get(i);
					//flag_pause = true;
					b.setflag_pause(true);
				}
			}
			if (choose.equals("move")) {
				for (int i = 0; i < list.size(); i++) {
					Ball b = list.get(i);
					b.setflag_pause(false);
				}
			}
			if (choose.equals("remove")) {
				for (int i = 0; i < list.size(); i++) {
					Ball b = list.get(i);
					b.setflag_stop(true);
					//flag_stop = true;
				}
			}
		}

	};

}

 

 

  • 大小: 223.5 KB
分享到:
评论

相关推荐

    C#.net同步异步SOCKET通讯和多线程总结2[参照].pdf

    C#.net 同步异步 SOCKET 通讯和多线程总结 本文旨在总结 C#.net 中的同步异步 SOCKET 通讯和多线程编程,涵盖服务端和客户端的实现细节。 一、服务端实现 服务端使用 System.Net 和 System.Net.Sockets 命名空间...

    windows多线程总结

    【Windows多线程总结】 Windows操作系统提供了一套完整的API来支持多线程编程,使得开发者可以在同一进程中同时执行多个线程,实现并发处理任务。本文将深入探讨Windows多线程编程的基本概念、线程同步、线程池以及...

    JAVA多线程总结

    【JAVA多线程总结】 Java 多线程是Java编程中的关键特性,它允许程序同时执行多个任务,提高系统的效率和响应性。本篇总结涵盖了Java多线程的基础概念、创建与启动、线程调度、同步与协作以及新特性。 **一、Java...

    C#.net同步异步SOCKET通讯和多线程总结

    C#.net同步异步SOCKET通讯和多线程总结 C#.net同步异步SOCKET通讯和多线程总结是指在C#.net环境下实现的同步异步套接字通信和多线程编程的总结。套接字(Socket)是tcp/ip网络协议接口,内部定义了许多的函数和例程...

    java多线程总结(一)

    ### 总结 Java多线程提供了强大的并发处理能力,开发者可以通过继承`Thread`类或实现`Runnable`接口来创建和管理线程。正确使用`start()`方法而非`run()`方法是确保线程正确启动的关键。理解Java多线程的工作原理和...

    C++多线程总结[归纳].pdf

    C++多线程总结 本文档对C++多线程编程进行了总结,介绍了三种创建线程的方法:CreateThread函数、AfxBeginThread函数和_beginthread()/_beginthreadex()函数,同时对线程的管理和终止进行了详细的讲解。 ...

    Java编程中多线程总结

    ### Java编程中多线程总结 #### 一、Java多线程概述 Java多线程是Java编程语言中一个至关重要的部分,它允许程序在单个应用程序中并发地执行多个任务,极大地提高了程序的效率和响应性。在Java 5之前,多线程的...

    Java线程总结.pdf

    总的来说,Java线程总结的知识点涵盖了线程的基本概念、创建与管理、生命周期、同步机制、线程间通信以及线程的活跃性问题。理解和掌握这些知识点对于开发高效、稳定、并发的Java应用程序至关重要。

    线程总结笔记

    ### 线程总结笔记——基于Linux环境下的线程控制与同步 #### 一、引言 本篇“线程总结笔记”主要针对Linux环境下多线程编程中的关键概念进行了整理与归纳,尤其是针对线程同步的问题进行了深入探讨。通过一个具体...

    c#多线程总结文档.ppt

    c# 多线程总结

    MFC 多线程总结

    在Windows应用程序开发中,MFC(Microsoft Foundation Classes)框架提供了对多线程的支持,使得开发者可以构建更加复杂的并发系统。MFC中的线程分为两类:工作者线程和用户界面线程,它们各自有不同的特性和用途。 ...

    java实现多线程总结.doc

    java实现多线程总结.doc

    Java并发编程实践(java concurrency in practice)pdf (java多线程总结.ppt)

    配合`JAVA多线程总结.ppt`,你可以得到一个更直观和简洁的概览,快速回顾和掌握上述关键知识点。虽然中文版翻译可能存在不足,但原版英文书籍通常能更准确地传达作者的意图和细节,值得深入阅读。

    Python113多线程总结.docx

    ..Python113多线程总结.docx

    Python113多线程总结.pdf

    ..Python113多线程总结.pdf

    C#dotnet同步异步SOCKET通讯和多线程总结

    C#dotnet同步异步SOCKET通讯和多线程总结

    我总结的Java线程总结

    Java线程是并发编程的核心部分,它允许程序在同一时间执行多个任务,极大地提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承`Thread`类和实现`Runnable`接口。 1. 继承`Thread`类: 当创建...

    java多线程总结

    本文将深入探讨Java多线程的相关知识点,包括线程的创建、线程的状态、同步机制以及线程安全问题。 1. **线程的创建** Java提供了两种创建线程的方式: - **继承Thread类**:自定义类继承Thread类,并重写run()...

Global site tag (gtag.js) - Google Analytics