java下雪_java多线程编程实现下雪效果

没有直接采用继承Thread类或者继承Runnable的接口来实现多线程,而是使用了匿名内部类。

要导入的类:

import javax.swing.*;

import java.awt.*;

1.定义SowPanel类,继承JPanel类,这个类有两个整型数组成员,用来保存雪花起始位置。在构造函数中为数组赋初值;重写父类的paint()方法;定义一个启动多线程的startSnow()方法。

class SnowPanel extends JPanel

{

//定义整型数组,存储雪花坐标

private int[] x=new int[300];

private int[] y=new int[300];

public SnowPanel()

{

//设置背景为黑色

setBackground(Color.black);

//用随机数初始化雪花坐标

for(int i=0;i

{

x[i]=(int)(Math.random()*800);

y[i]=(int)(Math.random()*600);

}

}

public void paint(Graphics g)

{

//继承父类画的方法

super.paint(g);

//设置颜色为白色

g.setColor(Color.white);

//利用循环画出多个雪花

for(int i=0;i

{

g.drawString("*",x[i],y[i]);

}

}

//定义一个方法启动多线程,并使用匿名内部类

public void startSnow()

{

new Thread()

{

public void run()

{

while(true)

{

for(int i=0;i

{

//坐标下移

y[i]++;

//检查是否越界

if(y[i]==600)

y[i]=0;

//重绘

repaint();

}

try

{

Thread.sleep(10);

}

catch (InterruptedException e)

{

e.printStackTrace();

}

}

}

}.start();

}

}

2.定义ShowFrame类,继承Jframe 类。在构造方法中设置窗口的显示属性,并创建ShowPanel对象,添加到窗口中。

class SnowPanel extends JPanel

{

//定义整型数组,存储雪花坐标

private int[] x=new int[300];

private int[] y=new int[300];

public SnowPanel()

{

//设置背景为黑色

setBackground(Color.black);

//用随机数初始化雪花坐标

for(int i=0;i

{

x[i]=(int)(Math.random()*800);

y[i]=(int)(Math.random()*600);

}

}

public void paint(Graphics g)

{

//继承父类画的方法

super.paint(g);

//设置颜色为白色

g.setColor(Color.white);

//利用循环画出多个雪花

for(int i=0;i

{

g.drawString("*",x[i],y[i]);

}

}

//定义一个方法启动多线程,并使用匿名内部类

public void startSnow()

{

new Thread()

{

public void run()

{

while(true)

{

for(int i=0;i

{

//坐标下移

y[i]++;

//检查是否越界

if(y[i]==600)

y[i]=0;

//重绘

repaint();

}

try

{

Thread.sleep(10);

}

catch (InterruptedException e)

{

e.printStackTrace();

}

}

}

}.start();

}

}

3.运行效果图片(此为静态图):

f98d5a6a65dd64d397705aa5b6420078.png

疑问:发现其他的不改变,继承Frame、Panel和继承JFrame、Jpanel的运行效果是不同的,前者显示的下雪场景总是有闪烁的感觉;后者则没有闪烁,个人感觉后者效果更好些。

接下来我们来看个例子

这里我们做一个完整的例子来说明线程产生的方式不同而生成的线程的区别:

package debug;

import java.io.*;

import java.lang.Thread;

class MyThread extends Thread{

public int x = 0;

public void run(){

System.out.println(++x);

}

}

class R implements Runnable{

private int x = 0;

public void run(){

System.out.println(++x);

}

}

public class Test {

public static void main(String[] args) throws Exception{

for(int i=0;i<10;i++){

Thread t = new MyThread();

t.start();

}

Thread.sleep(10000);//让上面的线程运行完成

R r = new R();

for(int i=0;i<10;i++){

Thread t = new Thread(r);

t.start();

}

}

}

上面10个线程对象产生的10个线程运行时打印了10次1。下面10个线程对象产生的10个线程运行时打印了1到10。我们把下面的10个线程称为同一实例(Runnable实例)的多个线程。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值