亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

回顧Java Beans

2019-11-18 12:09:51
字體:
來源:轉載
供稿:網友

  我們現在已理解了同步,接著可換從另一個角度來考察java Beans。無論什么時候創建了一個Bean,就必須假定它要在一個多線程的環境中運行。這意味著:
  (1) 只要可行,Bean的所有公共方法都應同步。當然,這也帶來了“同步”在運行期間的開銷。若非凡在意這個問題,在要害區域中不會造成問題的方法就可保留為“不同步”,但注重這通常都不是十分輕易判定。有資格的方法傾向于規模很?。ㄈ缦吕膅etCircleSize())以及/或者“微小”。也就是說,這個方法調用在如此少的代碼片里執行,以至于在執行期間對象不能改變。假如將這種方法設為“不同步”,可能對程序的執行速度不會有明顯的影響??赡芤矊⒁粋€Bean的所有public方法都設為synchronized,并只有在保證非凡必要、而且會造成一個差異的情況下,才將synchronized要害字刪去。
  (2) 假如將一個多造型事件送給一系列對那個事件感愛好的“聽眾”,必須假在列表中移動的時候可以添加或者刪除。
  第一點很輕易處理,但第二點需要考慮更多的東西。讓我們以前一章提供的BangBean.java為例。在那個例子中,我們忽略了synchronized要害字(那時還沒有引入呢),并將造型設為單造型,從而回避了多線程的問題。在下面這個修改過的版本中,我們使其能在多線程環境中工作,并為事件采用了多造型技術:
  //: BangBean2.java
  // You should write your Beans this way so they
  // can run in a multithreaded environment.
  import java.awt.*;
  import java.awt.event.*;
  import java.util.*;
  import java.io.*;
  public class BangBean2 extends Canvas
   implements Serializable {
   PRivate int xm, ym;
   private int cSize = 20; // Circle size
   private String text = "Bang!";
   private int fontSize = 48;
   private Color tColor = Color.red;
   private Vector actionListeners = new Vector();
   public BangBean2() {
   addMouseListener(new ML());
   addMouseMotionListener(new MM());
   }
   public synchronized int getCircleSize() {
   return cSize;
   }
   public synchronized void
   setCircleSize(int newSize) {
   cSize = newSize;
   }
   public synchronized String getBangText() {
   return text;
   }
   public synchronized void
   setBangText(String newText) {
   text = newText;
   }
   public synchronized int getFontSize() {
   return fontSize;
   }
   public synchronized void
   setFontSize(int newSize) {
   fontSize = newSize;
   }
   public synchronized Color getTextColor() {
   return tColor;
   }
   public synchronized void
   setTextColor(Color newColor) {
   tColor = newColor;
   }
   public void paint(Graphics g) {
   g.setColor(Color.black);
   g.drawOval(xm - cSize/2, ym - cSize/2,
   cSize, cSize);
   }
   // This is a multicast listener, which is
   // more typically used than the unicast
   // approach taken in BangBean.java:
   public synchronized void addActionListener (
   ActionListener l) {
   actionListeners.addElement(l);
   }
   public synchronized void removeActionListener(
   ActionListener l) {
   actionListeners.removeElement(l);
   }
   // Notice this isn't synchronized:
   public void notifyListeners() {
   ActionEvent a =
   new ActionEvent(BangBean2.this,
   ActionEvent.ACTION_PERFORMED, null);
   Vector lv = null;
   // Make a copy of the vector in case someone
   // adds a listener while we're
   // calling listeners:
   synchronized(this) {
   lv = (Vector)actionListeners.clone();
   }
   // Call all the listener methods:
   for(int i = 0; i < lv.size(); i++) {
   ActionListener al =
   (ActionListener)lv.elementAt(i);
   al.actionPerformed(a);
   }
   }
   class ML extends MouseAdapter {
   public void mousePressed(MouseEvent e) {
   Graphics g = getGraphics();
   g.setColor(tColor);
   g.setFont(
   new Font(
   "TimesRoman", Font.BOLD, fontSize));
   int width =
   g.getFontMetrics().stringWidth(text);
   g.drawString(text,
   (getSize().width - width) /2,
   getSize().height/2);
   g.dispose();
   notifyListeners();
   }
   }
   class MM extends MouseMotionAdapter {
   public void mouseMoved(MouseEvent e) {
   xm = e.getX();
   ym = e.getY();
   repaint();
   }
   }
   // Testing the BangBean2:
   public static void main(String[] args) {
   BangBean2 bb = new BangBean2();
   bb.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e){
   System.out.println("ActionEvent" + e);
   }
   });
   bb.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e){
   System.out.println("BangBean2 action");
   }
   });
   bb.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e){
   System.out.println("More action");
   }
   });
   Frame aFrame = new Frame("BangBean2 Test");
   aFrame.addWindowListener(new WindowAdapter(){
   public void windowClosing(WindowEvent e) {
   System.exit(0);
   }
   });
   aFrame.add(bb, BorderLayout.CENTER);
   aFrame.setSize(300,300);
   aFrame.setVisible(true);
   }
  }
  很輕易就可以為方法添加synchronized。但注重在addActionListener()和removeActionListener()中,現在添加了ActionListener,并從一個Vector中移去,所以能夠根據自己愿望使用任意多個。
  我們注重到,notifyListeners()方法并未設為“同步”??蓮亩鄠€線程中發出對這個方法的調用。另外,在對notifyListeners()調用的中途,也可能發出對addActionListener()和removeActionListener()的調用。這顯然會造成問題,因為它否定了Vector actionListeners。為緩解這個問題,我們在一個synchronized從句中“克隆”了Vector,并對克隆進行了否定。這樣便可在不影響notifyListeners()的前提下,對Vector進行操縱。
  paint()方法也沒有設為“同步”。與單純地添加自己的方法相比,決定是否對過載的方法進行同步要困難得多。在這個例子中,無論paint()是否“同步”,它似乎都能正常地工作。但必須考慮的問題包括:
  (1) 方法會在對象內部修改“要害”變量的狀態嗎?為判定一個變量是否“要害”,必須知道它是否會被程序中的其他線程讀取或設置(就目前的情況看,讀取或設置幾乎肯定是通過“同步”方法進行的,所以可以只對它們進行檢查)。對paint()的情況來說,不會發生任何修改。
  (2) 方法要以這些“要害”變量的狀態為基礎嗎?假如一個“同步”方法修改了一個變量,而我們的方法要用到這個變量,那么一般都愿意把自己的方法也設為“同步”。基于這一前提,大家可觀察到cSize由“同步”方法進行了修改,所以paint()應當是“同步”的。但在這里,我們可以問:“假如cSize在paint()執行期間發生了變化,會發生的最糟糕的事情是什么呢?”假如發現情況不算太壞,而且僅僅是暫時的效果,那么最好保持paint()的“不同步”狀態,以避免同步方法調用帶來的額外開銷。
  (3) 要留意的第三條線索是paint()基礎類版本是否“同步”,在這里它不是同步的。這并不是一個非常嚴格的參數,僅僅是一條“線索”。比如在目前的情況下,通過同步方法(好cSize)改變的一個字段已合成到paint()公式里,而且可能已改變了情況。但請注重,synchronized不能繼續——也就是說,假如一個方法在基礎類中是“同步”的,那么在衍生類過載版本中,它不會自動進入“同步”狀態。
  TestBangBean2中的測試代碼已在前一章的基礎上進行了修改,已在其中加入了額外的“聽眾”,從而演示了BangBean2的多造型能力。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
狠狠躁夜夜躁人人爽天天天天97| 日韩在线观看成人| 亚洲成人av中文字幕| 亚洲专区在线视频| 91成人在线视频| 日韩精品福利网站| 亚洲一区二区三区sesese| 最近中文字幕mv在线一区二区三区四区| 久久久精品999| 美女国内精品自产拍在线播放| 亚洲图片制服诱惑| 国产精品流白浆视频| 亚洲午夜久久久影院| 亚洲精品福利视频| 色无极影院亚洲| 福利二区91精品bt7086| 国产精品a久久久久久| 国产亚洲欧美另类中文| 亚洲国产美女久久久久| 欧美韩国理论所午夜片917电影| 亚洲片在线资源| 亚洲福利视频在线| 久久影院资源站| 亚洲午夜国产成人av电影男同| 国产激情久久久| 日韩成人中文电影| 国产精品老女人精品视频| 日韩欧美一区二区三区| 成人妇女免费播放久久久| 久久久久久18| 亚洲精品免费av| 久久久久久91香蕉国产| 91成品人片a无限观看| 欧美日韩激情网| 自拍偷拍免费精品| 亚洲精品一区二区三区不| 91av网站在线播放| 91在线高清免费观看| 91精品国产乱码久久久久久蜜臀| 欧美成人精品一区二区| 欧美丰满少妇xxxx| 欧美亚洲激情在线| 国产精品色午夜在线观看| 久久久久久久久久久网站| 97精品国产97久久久久久免费| 美女扒开尿口让男人操亚洲视频网站| 亚洲乱码一区av黑人高潮| 欧美肥老妇视频| 欧美成年人视频网站欧美| 国产丝袜精品第一页| 日本久久久久亚洲中字幕| 2019最新中文字幕| 一区二区三区久久精品| 亚洲图片欧美日产| 久久久亚洲精品视频| 亚洲第一区中文99精品| 成人免费福利在线| 亚洲成人av在线播放| 久久久在线免费观看| 91亚洲精品久久久| 国产一区二区av| 91av免费观看91av精品在线| 国产日韩精品电影| 青青久久av北条麻妃黑人| 欧美最猛性xxxxx免费| 国产在线拍偷自揄拍精品| 亚洲国产欧美一区二区三区同亚洲| 青草青草久热精品视频在线观看| 国产中文字幕日韩| 欧美成人精品一区二区三区| 久久久久国色av免费观看性色| 欧美国产一区二区三区| 亚洲欧美国产va在线影院| 97视频在线观看播放| 国产精品久久久久久亚洲影视| 中文字幕精品久久| 欧美色道久久88综合亚洲精品| 91精品啪aⅴ在线观看国产| 国产日韩欧美成人| 亚洲综合小说区| 久久精品视频va| 欧美高清在线视频观看不卡| 亚洲成avwww人| 色妞欧美日韩在线| 国产亚洲欧美另类中文| 色777狠狠综合秋免鲁丝| 中文字幕9999| 一区二区三区高清国产| 丝袜情趣国产精品| 国产精品专区h在线观看| 亚洲精品自拍视频| 91久久国产精品91久久性色| 欧美精品videos另类日本| 亚洲香蕉伊综合在人在线视看| 国产精品国产三级国产aⅴ浪潮| 国产视频精品自拍| 国产成人精品999| 97视频免费观看| 国产色婷婷国产综合在线理论片a| 欧美激情一区二区三区成人| 欧美一区三区三区高中清蜜桃| 午夜精品福利电影| 欧洲中文字幕国产精品| 97在线免费视频| 色综合视频网站| 欧美在线观看视频| 欧美精品久久久久久久久| 97激碰免费视频| 国产精品成人av性教育| 视频在线观看99| 91免费视频国产| 久久久999精品视频| 亚洲福利视频久久| 日韩亚洲在线观看| 一本色道久久综合亚洲精品小说| 日韩中文在线视频| 欧美激情videoshd| 国产日韩精品在线播放| 97视频免费在线观看| 国产精品爱久久久久久久| 精品在线欧美视频| 久久久久国色av免费观看性色| 国产成人福利视频| 成人国产精品久久久久久亚洲| 热99精品里视频精品| 亚洲一区二区免费| 久久精品2019中文字幕| 国产欧美日韩91| 少妇高潮久久久久久潘金莲| 伊人久久久久久久久久| 亚洲欧美色图片| 亚洲人线精品午夜| 亚洲精品日韩丝袜精品| 国产精品精品一区二区三区午夜版| 91日本在线视频| 亚洲精品美女久久久久| 欧美黑人视频一区| 日韩精品在线免费播放| 日韩av在线直播| 中文字幕亚洲欧美日韩在线不卡| 在线精品视频视频中文字幕| 91精品国产高清自在线看超| 欧美精品久久久久a| 日韩中文字在线| 欧美日韩在线另类| 欧美人在线视频| 国产精品91久久久久久| 国产精品亚洲第一区| 国产精品白嫩美女在线观看| 在线成人中文字幕| 亚洲精品久久久久久久久久久久| 亚洲男子天堂网| 一本色道久久综合亚洲精品小说| 国产精品r级在线| 尤物yw午夜国产精品视频| 亚洲一区二区三| 国产欧美在线看| 国产欧美精品日韩精品| 久久躁狠狠躁夜夜爽| 欧美精品九九久久| 久久精品中文字幕一区| 国产精品黄页免费高清在线观看| 美日韩在线视频| 亚洲网在线观看|