你的位置:首页 > Java教程

[Java教程]初学多线程练习2


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

要导入的类:

1 import javax.swing.*;2 import java.awt.*;

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

 1 class SnowPanel extends JPanel 2 { 3   //定义整型数组,存储雪花坐标 4   private int[] x=new int[300]; 5   private int[] y=new int[300]; 6  7   public SnowPanel() 8   { 9     //设置背景为黑色10     setBackground(Color.black);11     //用随机数初始化雪花坐标12     for(int i=0;i<x.length;i++)13     {14       x[i]=(int)(Math.random()*800);15       y[i]=(int)(Math.random()*600);16     }17   }18   19   public void paint(Graphics g)20   {21     //继承父类画的方法22     super.paint(g);23     //设置颜色为白色24     g.setColor(Color.white);25     //利用循环画出多个雪花26     for(int i=0;i<x.length;i++)27     {28       g.drawString("*",x[i],y[i]);29     }30   }31   //定义一个方法启动多线程,并使用匿名内部类32   public void startSnow()33   {34     new Thread()35     {36       public void run()37       {38         while(true)39         {40           for(int i=0;i<y.length;i++)41           {42             //坐标下移43             y[i]++;44             //检查是否越界45             if(y[i]==600)46             y[i]=0;47             //重绘48             repaint();49           }50           51           try52            {53             Thread.sleep(10);54            }55             catch (InterruptedException e)56            {57             e.printStackTrace();58            }59         }60       }61     }.start();62   }63 }

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

 1 class SnowPanel extends JPanel 2 { 3   //定义整型数组,存储雪花坐标 4   private int[] x=new int[300]; 5   private int[] y=new int[300]; 6  7   public SnowPanel() 8   { 9     //设置背景为黑色10     setBackground(Color.black);11     //用随机数初始化雪花坐标12     for(int i=0;i<x.length;i++)13     {14       x[i]=(int)(Math.random()*800);15       y[i]=(int)(Math.random()*600);16     }17   }18   19   public void paint(Graphics g)20   {21     //继承父类画的方法22     super.paint(g);23     //设置颜色为白色24     g.setColor(Color.white);25     //利用循环画出多个雪花26     for(int i=0;i<x.length;i++)27     {28       g.drawString("*",x[i],y[i]);29     }30   }31   //定义一个方法启动多线程,并使用匿名内部类32   public void startSnow()33   {34     new Thread()35     {36       public void run()37       {38         while(true)39         {40           for(int i=0;i<y.length;i++)41           {42             //坐标下移43             y[i]++;44             //检查是否越界45             if(y[i]==600)46             y[i]=0;47             //重绘48             repaint();49           }50           51           try52            {53             Thread.sleep(10);54            }55             catch (InterruptedException e)56            {57             e.printStackTrace();58            }59         }60       }61     }.start();62   }63 }

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

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