没有直接采用继承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.length;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<x.length;i++) { g.drawString("*",x[i],y[i]); } } //定义一个方法启动多线程,并使用匿名内部类 public void startSnow() { new Thread() { public void run() { while(true) { for(int i=0;i<y.length;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.length;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<x.length;i++) { g.drawString("*",x[i],y[i]); } } //定义一个方法启动多线程,并使用匿名内部类 public void startSnow() { new Thread() { public void run() { while(true) { for(int i=0;i<y.length;i++) { //坐标下移 y[i]++; //检查是否越界 if(y[i]==600) y[i]=0; //重绘 repaint(); } try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } }
3.运行效果图片(此为静态图):
疑问:发现其他的不改变,继承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实例)的多个线程。
本文向大家介绍java多线程实现文件下载,包括了java多线程实现文件下载的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java多线程实现文件下载的具体代码,供大家参考,具体内容如下 1、DownloadManager类 2、DownloadThread类 3、TestDownload测试类 代码已经测试可以运行! 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多
本文向大家介绍Java编程实现多线程TCP服务器完整实例,包括了Java编程实现多线程TCP服务器完整实例的使用技巧和注意事项,需要的朋友参考一下 相关Java类 Socket public class Socket extends Object ServerSocket public class ServerSocket extends Object TCP服务器端 TcpServer.java
本文向大家介绍java多线程实现文件下载功能,包括了java多线程实现文件下载功能的使用技巧和注意事项,需要的朋友参考一下 多线程下载文件的思路: 1.首先获取到文件的总大小 获取文件大小的方式是通过网络读取,getContentLength()即可获取到文件的大小,使用RandomAccessFile()支持随机访问 2.根据所准备的线程数据,计算每一个线程需要下载的文件的大小 上图显示下载40
本文向大家介绍Linux下的多线程编程(三),包括了Linux下的多线程编程(三)的使用技巧和注意事项,需要的朋友参考一下 下面先来一个实例。我们通过创建两个线程来实现对一个数的递加。 或许这个实例没有实际运用的价值,但是稍微改动一下,我们就可以用到其他地方去拉。 下面是我们的代码: 下面我们先来编译、执行一下 引文: 实例代码里头的注释应该比较清楚了吧,下面我把网路上介绍上面涉及到的几个函
多线程编程Demo,包括 GCD 的使用,block 的使用,NSThread 的使用,异步下载,同步下载等。 [Code4App.com]
本文向大家介绍java多线程编程之InheritableThreadLocal,包括了java多线程编程之InheritableThreadLocal的使用技巧和注意事项,需要的朋友参考一下 InheritableThreadLocal的作用: 当我们需要在子线程中使用父线程中的值得时候我们就可以像使用ThreadLocal那样来使用InheritableThreadLocal了。 首先我们来看一