回首runnable
当前位置:以往代写 > JAVA 教程 >回首runnable
2019-06-14

回首runnable

回首runnable

在本章早些时候,我曾发起各人在将一个措施片或主Frame看成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机制在速度上造成的戏剧性的差别。

    关键字:

在线提交作业