下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

快速了解在学习java中runnable的技巧

作者:课课家教育     来源: http://www.kokojia.com点击数:674发布时间: 2016-02-29 20:02:43

标签: java线程java继承java设计

大神带你学编程,欢迎选课

  在本章早些时候,我曾建议大家在将一个程序片或主Frame当作Runnable的实现形式之前,一定要好好地想一想。若采用那种方式,就只能在自己的程序中使用其中的一个线程。这便限制了灵活性,一旦需要用到属于那种类型的多个线程,就会遇到不必要的麻烦。

快速了解在学习java中runnable的技巧

  当然,如果必须从一个类继承,而且想使类具有线程处理能力,则Runnable是一种正确的方案。本章最后一个例子对这一点进行了剖析,制作了一个RunnableCanvas类,用于为自己描绘不同的颜色(Canvas是“画布”的意思)。这个应用被设计成从命令行获得参数值,以决定颜色网格有多大,以及颜色发生变化之间的sleep()有多长。通过运用这些值,大家能体验到线程一些有趣而且可能令人费解的特性:

  //: ColorBoxes.java

  // Using the Runnable interface

  import java.awt.*;

  import java.awt.event.*;

  class CBox extends Canvas implements Runnable {

  private Thread t;

  private int pause;

  private static final Color[] colors = {

  Color.black, Color.blue, Color.cyan,

  Color.darkGray, Color.gray, Color.green,

  Color.lightGray, Color.magenta,

  Color.orange, Color.pink, Color.red,

  Color.white, Color.yellow

  };

  private Color cColor = newColor();

  private static final Color newColor() {

  return colors[

  (int)(Math.random() * colors.length)

  ];

  }

  public void paint(Graphics g) {

  g.setColor(cColor);

  Dimension s = getSize();

  g.fillRect(0, 0, s.width, s.height);

  }

  public CBox(int pause) {

  this.pause = pause;

  t = new Thread(this);

  t.start();

  }

  public void run() {

  while(true) {

  cColor = newColor();

  repaint();

  try {

  t.sleep(pause);

  } catch(InterruptedException e) {}

  }

  }

  }

  public class ColorBoxes extends Frame {

  public ColorBoxes(int pause, int grid) {

  setTitle("ColorBoxes");

  sETLayout(new GridLayout(grid, grid));

  for (int i = 0; i < grid * grid; i++)

  add(new CBox(pause));

  addwindowListener(new WindowAdapter() {

  public void windowClosing(WindowEvent e) {

  System.exit(0);

  }

  });

  }

  public static void main(String[] args) {

  int pause = 50;

  int grid = 8;

  if(args.length > 0)

  pause = Integer.parseInt(args[0]);

  if(args.length > 1)

  grid = Integer.parseInt(args[1]);

  Frame f = new ColorBoxes(pause, grid);

  f.setSize(500, 400);

  f.setVisible(true);

  }

  } ///:~

  ColorBoxes是一个典型的应用(程序),有一个构建器用于设置GUI。这个构建器采用int grid的一个参数,用它设置GridLayout(网格布局),使每一维里都有一个grid单元。随后,它添加适当数量的CBox对象,用它们填充网格,并为每一个都传递pause值。在main()中,我们可看到如何对pause和grid的默认值进行修改(如果用命令行参数传递)。

  CBox是进行正式工作的地方。它是从Canvas继承的,并实现了Runnable接口,使每个Canvas也能是一个Thread。记住在实现Runnable的时候,并没有实际产生一个Thread对象,只是一个拥有run()方法的类。因此,我们必须明确地创建一个Thread对象,并将Runnable对象传递给构建器,随后调用start()(在构建器里进行)。在CBox里,这个线程的名字叫作t。

  请留意数组colors,它对Color类中的所有颜色进行了列举(枚举)。它在newColor()中用于产生一种随机选择的颜色。当前的单元(格)颜色是cColor。

  paint()则相当简单——只是将颜色设为cColor,然后用那种颜色填充整张画布(Canvas)。

  在run()中,我们看到一个无限循环,它将cColor设为一种随机颜色,然后调用repaint()把它显示出来。随后,对线程执行sleep(),使其“休眠”由命令行指定的时间长度。

  由于这种设计方案非常灵活,而且线程处理同每个Canvas元素都紧密结合在一起,所以在理论上可以生成任意多的线程(但在实际应用中,这要受到JVM能够从容对付的线程数量的限制)。

  这个程序也为我们提供了一个有趣的评测基准,因为它揭示了不同JVM机制在速度上造成的戏剧性的差异。

赞(16)
踩(3)
分享到:
华为认证网络工程师 HCIE直播课视频教程