一,线程
线程是系统对代码的执行进程,如果将系统当做一个员工,被安排执行某个任务的时候,他不会对任何其他的任务作出响应。只有当这个任务执行完毕,才可以重新给他分配任务。
多线程是指,将原本线性执行的任务分开成若干个子任务同步执行,这样做的优点是防止线程“堵塞”,增强用户体验和程序的效率。缺点是代码的复杂程度会大大提高,而且对于硬件的要求也相应地提高 。
优点:
1、使用线程可以把占据时间长的程序中的任务放到后台去处理。
2、程序的运行速度可能加快。
缺点:
1、如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换。
2、更多的线程需要更多的内存空间。
二,实现线程并启动线程
(1)单线程:main线程
public static void main(String[] args){
int count=0;
for(int i=0;i<10;i++){
count++;
}
System.out.println("任务1执行完"+count);
int count1=100;
for(int i=100;i>10;i--){
count--;
}
System.out.println("任务2执行完"+count1);
}
(2)多线程实现
1,extends Thread类实现,重写run方法
public class ThreadDemo1 extends Thread{
public void run(){
for(int i=0;i<100;i++){
System.out.println("线程1执行中"+i);
}
}
}
2,implements Runnable 接口实现,重写run方法
public class RunnableDemo1 implements Runnable{
public void run(){
for(int i=0;i<100;i++){
System.out.println("线程2执行中"+i);
}
}
}
(3)线程启动
1,继承Thread类实现的线程类:创建线程类对象,调用start方法
2,实现Runnable接口实现的线程类:创建实现线程类的对象,将实现的线程类对象作为参数传到Thread构造方法创建对象,使用Thread对象调用start方法
public static void main(String[] args){
ThreadDemo1 td1 = new ThreadDemo1();
RunnableDemo1 rd1 = new RunnableDemo1();
Thread t2 = new Thread(rd1);
td1.start();
t2.start();
}
三,多个小球在界面移动
1,绘制界面
public class GameUI extends JFrame {
public void initUI(){
setTitle("线程游戏-v0.1");
setSize(800,600);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
2,创建第一个小球
1)extends Thread类实现,重写run方法
2)为使小球可以动起来把坐标设成变量并放在循环里
3)通过g.fillOval(x,y,50,50);画出小球
4)sleep()控制小球的速度
public class Ball_1 extends Thread{
int x,y;
Graphics g;
public Ball_1(JFrame jf){
this.g = jf.getGraphics();
}
public void run(){
for (int i=0;i<100;i++){
try {
Thread.sleep(60);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
g.fillOval(x,y,50,50);
x++;
y++;
}
}
}
3,创建第二个小球
1)extends Thread类实现,重写run方法
2)为使小球起始坐标随机化使用Random随机生成起始坐标
3)为使小球坐标移动随机化也使用Random随机生成坐标的移动速度
4)小球的颜色也通过Random进行了随机化
5)在有颜色的小球后面再画一个白色的小球来去除移动轨迹
6)对小球坐标范围进行限制,保证不会超出界面
7)去除循环条件使小球可以一直移动下去
8)sleep()控制小球的速度
public class Ball_2 extends Thread{
int x1,y1;
Graphics g;
public Ball_2(JFrame jf){
this.g = jf.getGraphics();
}
int speedx = -2;
int speedy = -5;
public void run(){
Random ran = new Random();
x1=ran.nextInt(800);
y1=ran.nextInt(600);
speedx = ran.nextInt(10)-5;
speedy = ran.nextInt(10)-5;
Color color = new Color(ran.nextInt(Integer.MAX_VALUE));
for (int i=0; ;i++){
g.setColor(color);
g.fillOval(x1,y1,50,50);
try {
Thread.sleep(20);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
g.setColor(Color.WHITE);
g.fillOval(x1,y1,50,50);
x1+=speedx;
y1+=speedy;
if(x1<=0 || x1>=720){
speedx=-speedx;
}
if(y1<=0 || y1>=520){
speedy=-speedy;
}
}
}
}
4,启动线程
1)将创建对象移动到画图的外面,保证小球个数不变
2)对第二个小球套个循环可实现多个线程启动
3)继承Thread类实现的线程类:创建线程类对象,调用start方法启动线程
public class GameUI extends JFrame {
public void initUI(){
setTitle("线程游戏-v0.1");
setSize(800,600);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
ball1 = new Ball_1(this);
ball1.start();
for(int i=0;i<10;i++){
ball2 = new Ball_2(this);
ball2.start();
}
}
Ball_1 ball1;
Ball_2 ball2;
public void paint(Graphics g){
super.paint(g);
}
public static void main(String[] args){
new GameUI().initUI();
}
}
5,运行效果
四,完整代码
1,GameUI
package SmallBall;
import javax.swing.*;
import java.awt.*;
public class GameUI extends JFrame {
public void initUI(){
setTitle("线程游戏-v0.1");
setSize(800,600);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
ball1 = new Ball_1(this);
ball1.start();
for(int i=0;i<10;i++){
ball2 = new Ball_2(this);
ball2.start();
}
}
Ball_1 ball1;
Ball_2 ball2;
public void paint(Graphics g){
super.paint(g);
}
public static void main(String[] args){
new GameUI().initUI();
}
}
2,Ball_1
package SmallBall;
import javax.swing.*;
import java.awt.*;
public class Ball_1 extends Thread{
int x,y;
Graphics g;
public Ball_1(JFrame jf){
this.g = jf.getGraphics();
}
public void run(){
for (int i=0;i<100;i++){
try {
Thread.sleep(60);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
g.fillOval(x,y,50,50);
x++;
y++;
}
}
}
3,Ball_2
package SmallBall;
import javax.swing.*;
import java.awt.*;
import java.util.Random;
public class Ball_2 extends Thread{
int x1,y1;
Graphics g;
public Ball_2(JFrame jf){
this.g = jf.getGraphics();
}
int speedx = -2;
int speedy = -5;
public void run(){
Random ran = new Random();
x1=ran.nextInt(800);
y1=ran.nextInt(600);
speedx = ran.nextInt(10)-5;
speedy = ran.nextInt(10)-5;
Color color = new Color(ran.nextInt(Integer.MAX_VALUE));
for (int i=0; ;i++){
g.setColor(color);
g.fillOval(x1,y1,50,50);
try {
Thread.sleep(20);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
g.setColor(Color.WHITE);
g.fillOval(x1,y1,50,50);
x1+=speedx;
y1+=speedy;
if(x1<=0 || x1>=720){
speedx=-speedx;
}
if(y1<=0 || y1>=520){
speedy=-speedy;
}
}
}
}