当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:16:00  来源:本站整理

过量的线程[Java编程]

赞助商链接



  本文“过量的线程[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
有些时刻,我们会发现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吗?
象这样的一些问题是造成多线程利用程序的编制成为一种“技术活”的缘由之一.
  以上是“过量的线程[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 过量的线程
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .