熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

編程技巧:在Java應用開發中如何使用線程

2013-11-23 19:54:40  來源: Java高級技術 

  Java平台從開始就被設計成為多線程環境在你的主程序執行的時候其它作業如碎片收集和事件處理則是在後台進行的
  
  本質上你可以認為這些作業是線程它們正好是系統管理線程但是無論如何它們是線程線程使你能夠定義相互獨立的作業彼此之間互不干擾系統將交換這些作業進或出CPU這樣(從外部看來)它們好象是同時運行的
  
  在你需要在你的程序中處理多個作業時你也可以使用多個進程這些進程可以是你自己創建的你也可以操縱系統線程你進行這些多作業處理要使用幾個不同的類或接口
  
  javautilTimer類
  javaxswingTimer類
  Thread類
  Runnable接口
  
  對於簡單的作業通常需要重復的你可以使用javautilTimer類告訴它每半秒鐘做一次注意大多數系統例程是使用毫秒的半秒鐘是毫秒
  
  你希望Timer實現的任務是在javautilTimerTask實例中定義的其中運行的方法包含要執行的任務這些在Hi類中進行了演示其中字符串Hi重復地被顯示在屏幕上直到你按Enter鍵
  
  import javautil*;
  
  public class Hi
  {
  public static void main
  (String args[])
  throws javaioIOException
  {
  TimerTask task = new TimerTask()
  {
  public void run()
  {
  Systemoutprintln(Hi);
  }
  };
  Timer timer = new Timer();
  timerschedule(task );
  Systemoutprintln
  (Press ENTER to stop);
  Systeminread(new byte[]);
  timercancel();
  }
  }
  
  Java Runtime Environment工作的方式是只要有一個線程在運行程序就不退出這樣當取消被調用沒有其它線程在運行了則程序退出有一些系統線程在運行如碎片收集程序這些系統線程也被稱為後台線程後台線程的存在不影響運行環境被關閉只有非後台線程保證運行環境不被關閉
  
  JavaxswingTimer類與javautiltimer類的工作方式相似但是有一些差別需要注意第一運行的作業被ActionListener接口的實現來定義第二作業的執行是在事件處理線程內部進行的而不象javautilTimer類是在它的外部這是很重要的因為它關系到Swing組件集是如何設計的
  
  如果你不熟悉Swing它是一組可以被Java程序使用的圖形組件Swing被設計程被稱為單線程的這意味著對Swing類內部內容的訪問必須在單個線程中完成這個特定的線程是事件處理線程
  
  這樣例如你想改變Label組件的文字你不能僅僅調用Jlabel的setText方法相反你必須確認setText調用發生在事件處理線程中而這正是javaxswingTime類派的上用場的地方
  
  為了說明這第二種情況下面的程序顯示一個增加的計數器的值美半秒鐘計數器的數值增加並且新的數值被顯示:
  
  import javaxswing*;
  import javaawt*;
  import javaawtevent*;
  
  public class Count
  {
  public static void
  main(String args[])
  {
  JFrame frame = new JFrame();
  framesetDefaultCloseOperation
  (JFrameEXIT_ON_CLOSE);
  Container contentPane =
  framegetContentPane();
  final JLabel label =
  new JLabel( JLabelCENTER);
  labelsetFont(new Font
  (Serif FontPLAIN ));
  contentPaneadd(label
  BorderLayoutCENTER);
  ActionListener listener
  = new ActionListener()
  {
  int count = ;
  public void actionPerformed
  (ActionEvent e)
  {
  count++;
  labelsetText
  (IntegertoString(count));
  }
  };
  Timer timer = new Timer( listener);
  timerstart();
  framesetSize( );
  frameshow();
  }
  }
  上述程序的結果是
  

  萬一你要做的不是一個簡單的重復作業javalangThread類就派上了用場它允許你自己控制基本功能通過創建Thread的一個子類你可以使你的系統脫離並進行一個長時間運行的作業如從網絡上讀取一個文件而不阻礙你的其它程序的運行這種長時間運行的作業將在run方法中定義
  
  第二種方式是創建Thread類的子類並在子類中實現run方法或在實現runnable的類中實現run方法並將這個實現傳遞給Thread的構造函數
  
  你可能會問有什麼區別Java編程語言僅支持單一繼承如果你設計的調用是除了Thread以外的其它類你可以是你的類實現Runnable而它可以是你的作業被執行否則你定義Thread的子類來運行你的Run方法在處理過程中不再添加其它操作
  
  對於創建Thread子類的第三種情況下面的程序生成了一個新的線程來計算一個特定URL的字符數這個URL是通過命令行傳遞進來的在這進行過程之中實現Runnable的第四種情況被演示打印出重復的消息
  
  注意在實現Runnable的這後一種情況下你必須提供重復消息的代碼你必須同時sleep以分配時間並完成操作在兩種情況下與使用Timer相比較這段程序的最後一部分包含有你從命令行讀取命令以觸發程序結束注意在系統讀取URL並打印消息的同時你總可以按Enter鍵結束程序
  
  import javaio*;
  import *;
  
  public class Both
  {
  public static void
  main(String args[])
  {
  final String urlString = args[];
  final String message = args[];
  Thread thread = new Thread()
  {
  public void run()
  {
  try
  {
  URL url = new URL(urlString);
  URLConnection connection =
  urlopenConnection();
  InputStreamReader isr = new
  InputStreamReader(
  connectiongetInputStream());
  BufferedReader reader =
  new BufferedReader(isr);
  int count = ;
  while (readerread() != )
  {
  count++;
  }
  Systemoutprintln(Size is :
  + count);
  readerclose();
  } catch (MalformedURLException e)
  {
  Systemerrprintln(Bad URL:
  + urlString);
  } catch (IOException e)
  {
  Systemerrprintln
  (I/O Problems);
  }
  }
  };
  threadstart();
  Runnable runnable = new Runnable()
  {
  public void run()
  {
  while(true)
  {
  Systemoutprintln(message);
  try
  {
  Threadsleep();
  } catch (InterruptedException e)
  {
  }
  }
  }
  };
  Thread thread = new Thread(runnable);
  threadstart();
  try {
  Systemoutprintln
  (Press ENTER to stop);
  Systeminread(new byte[]);
  } catch (IOException e)
  {
  Systemoutprintln(I/O problems);
  }
  Systemexit();
  }
  }
  
  因為有多種方式來處理線程你選用哪種技術取決於你和你面臨的條件要成為一個有效的Java編程人員盡管你通常不必學習Java編程語言的所有內容和核心庫但是線程是一個例外你越早了解線程如何工作和如何使用線程你將越早了解Java程序如何工作和交互
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27654.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.