过多的线程
当前位置:以往代写 > JAVA 教程 >过多的线程
2019-06-14

过多的线程

过多的线程

有些时候,我们会发明ColorBoxes险些陷于搁浅状态。在我本身的呆板上,这一环境在发生了10×10的网格之后产生了。为什么会这样呢?自然地,我们有来由猜疑AWT对它做了什么工作。所以这里有一个例子可以或许测试谁人揣摩,它发生了较少的线程。代码颠末尾从头组织,使一个Vector实现了Runnable,并且谁人Vector容纳了数量浩瀚的色块,并随机挑选一些举办更新。随后,我们建设大量这些Vector工具,数量大抵取决于我们挑选的网格维数。功效即是我们获得比色块少得多的线程。所以如果有一个速度的加速,我们就能当即知道,因为前例的线程数量太多了。如下所示:
 

//: ColorBoxes2.java
// Balancing thread use
import java.awt.*;
import java.awt.event.*;
import java.util.*;

class CBox2 extends Canvas {
  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)
    ];
  }
  void nextColor() {
    cColor = newColor();
    repaint();
  }
  public void paint(Graphics  g) {
    g.setColor(cColor);
    Dimension s = getSize();
    g.fillRect(0, 0, s.width, s.height);
  }
}

class CBoxVector 
  extends Vector implements Runnable {
  private Thread t;
  private int pause;
  public CBoxVector(int pause) {
    this.pause = pause;
    t = new Thread(this);
  }
  public void go() { t.start(); }
  public void run() {
    while(true) {
      int i = (int)(Math.random() * size());
      ((CBox2)elementAt(i)).nextColor();
      try {
        t.sleep(pause);
      } catch(InterruptedException e) {}
    } 
  }
}

public class ColorBoxes2 extends Frame {
  private CBoxVector[] v;
  public ColorBoxes2(int pause, int grid) {
    setTitle("ColorBoxes2");
    setLayout(new GridLayout(grid, grid));
    v = new CBoxVector[grid];
    for(int i = 0; i < grid; i++)
      v[i] = new CBoxVector(pause);
    for (int i = 0; i < grid * grid; i++) {
      v[i % grid].addElement(new CBox2());
      add((CBox2)v[i % grid].lastElement());
    }
    for(int i = 0; i < grid; i++)
      v[i].go();
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    });
  }   
  public static void main(String[] args) {
    // Shorter default pause than ColorBoxes:
    int pause = 5;
    int grid = 8;
    if(args.length > 0) 
      pause = Integer.parseInt(args[0]);
    if(args.length > 1)
      grid = Integer.parseInt(args[1]);
    Frame f = new ColorBoxes2(pause, grid);
    f.setSize(500, 400);
    f.setVisible(true);  
  }
} ///:~

在ColorBoxes2中,我们建设了CBoxVector的一个数组,并对其初始化,使其容下各个CBoxVector网格。每个网格都知道本身该“睡眠”多长的时间。随后为每个CBoxVector都添加等量的Cbox2工具,并且将每个Vector都汇报给go(),用它来启动本身的线程。
CBox2雷同CBox——能用一种随机选择的颜色描画本身。但那就是CBox2可以或许做的全部事情。所有涉及线程的处理惩罚都已移至CBoxVector举办。
CBoxVector也可以拥有担任的Thread,并有一个范例为Vector的成员工具。这样设计的长处就是addElement()和elementAt()要领可以得到特定的参数以及返回值范例,而不是只能得到通例Object(它们的名字也可以变得更短)。然而,这里回收的设计外貌上看需要较少的代码。除此以外,它会自动保存一个Vector的其他所有行为。由于elementAt()需要大量举办“关闭”事情,用到很多括号,所以跟着代码主体的扩充,最终仍有大概需要大量代码。
和以前一样,在我们实现Runnable的时候,并没有得到与Thread配套提供的所有成果,所以必需建设一个新的Thread,并将本身通报给它的构建器,以便正式“启动”——start()——一些对象。各人在CBoxVector构建器和go()里都可以体会到这一点。run()要领简朴地选择Vector里的一个随机元素编号,并为谁人元素挪用nextColor(),令其挑选一种新的随机颜色。
运行这个措施时,各人会发明它确实变得更快,响应也更迅速(好比在间断它的时候,它能更快地停下来)。并且跟着网格尺寸的壮大,它也不会常常性地陷于“搁浅”状态。因此,线程的处理惩罚又多了一项新的思量因素:必需随时查抄本身有没有“太多的线程”(无论对什么措施和运行平台)。若线程太多,必需试着利用上面先容的技能,对措施中的线程数量举办“均衡”。假如在一个多线程的措施中碰着了机能上的问题,那么此刻有很多因素需要查抄:
(1) 对sleep,yield()以及/可能wait()的挪用足够多吗?
(2) sleep()的挪用时间足够长吗?
(3) 运行的线程数是不是太多?
(4) 试过差异的平台和JVM吗?
象这样的一些问题是造成多线程应用措施的体例成为一种“技能活”的原因之一。

    关键字:

在线提交作业