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; } } } }; }
相关推荐
C#.net 同步异步 SOCKET 通讯和多线程总结 本文旨在总结 C#.net 中的同步异步 SOCKET 通讯和多线程编程,涵盖服务端和客户端的实现细节。 一、服务端实现 服务端使用 System.Net 和 System.Net.Sockets 命名空间...
【Windows多线程总结】 Windows操作系统提供了一套完整的API来支持多线程编程,使得开发者可以在同一进程中同时执行多个线程,实现并发处理任务。本文将深入探讨Windows多线程编程的基本概念、线程同步、线程池以及...
【JAVA多线程总结】 Java 多线程是Java编程中的关键特性,它允许程序同时执行多个任务,提高系统的效率和响应性。本篇总结涵盖了Java多线程的基础概念、创建与启动、线程调度、同步与协作以及新特性。 **一、Java...
C#.net同步异步SOCKET通讯和多线程总结 C#.net同步异步SOCKET通讯和多线程总结是指在C#.net环境下实现的同步异步套接字通信和多线程编程的总结。套接字(Socket)是tcp/ip网络协议接口,内部定义了许多的函数和例程...
### 总结 Java多线程提供了强大的并发处理能力,开发者可以通过继承`Thread`类或实现`Runnable`接口来创建和管理线程。正确使用`start()`方法而非`run()`方法是确保线程正确启动的关键。理解Java多线程的工作原理和...
C++多线程总结 本文档对C++多线程编程进行了总结,介绍了三种创建线程的方法:CreateThread函数、AfxBeginThread函数和_beginthread()/_beginthreadex()函数,同时对线程的管理和终止进行了详细的讲解。 ...
### Java编程中多线程总结 #### 一、Java多线程概述 Java多线程是Java编程语言中一个至关重要的部分,它允许程序在单个应用程序中并发地执行多个任务,极大地提高了程序的效率和响应性。在Java 5之前,多线程的...
总的来说,Java线程总结的知识点涵盖了线程的基本概念、创建与管理、生命周期、同步机制、线程间通信以及线程的活跃性问题。理解和掌握这些知识点对于开发高效、稳定、并发的Java应用程序至关重要。
### 线程总结笔记——基于Linux环境下的线程控制与同步 #### 一、引言 本篇“线程总结笔记”主要针对Linux环境下多线程编程中的关键概念进行了整理与归纳,尤其是针对线程同步的问题进行了深入探讨。通过一个具体...
c# 多线程总结
在Windows应用程序开发中,MFC(Microsoft Foundation Classes)框架提供了对多线程的支持,使得开发者可以构建更加复杂的并发系统。MFC中的线程分为两类:工作者线程和用户界面线程,它们各自有不同的特性和用途。 ...
java实现多线程总结.doc
配合`JAVA多线程总结.ppt`,你可以得到一个更直观和简洁的概览,快速回顾和掌握上述关键知识点。虽然中文版翻译可能存在不足,但原版英文书籍通常能更准确地传达作者的意图和细节,值得深入阅读。
..Python113多线程总结.docx
..Python113多线程总结.pdf
C#dotnet同步异步SOCKET通讯和多线程总结
Java线程是并发编程的核心部分,它允许程序在同一时间执行多个任务,极大地提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承`Thread`类和实现`Runnable`接口。 1. 继承`Thread`类: 当创建...
本文将深入探讨Java多线程的相关知识点,包括线程的创建、线程的状态、同步机制以及线程安全问题。 1. **线程的创建** Java提供了两种创建线程的方式: - **继承Thread类**:自定义类继承Thread类,并重写run()...