一,线程
线程是系统对代码的执行进程,如果将系统当做一个员工,被安排执行某个任务的时候,他不会对任何其他的任务作出响应。只有当这个任务执行完毕,才可以重新给他分配任务。
多线程是指,将原本线性执行的任务分开成若干个子任务同步执行,这样做的优点是防止线程“堵塞”,增强用户体验和程序的效率。缺点是代码的复杂程度会大大提高,而且对于硬件的要求也相应地提高 。
优点:
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; } } } }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/122912.html