<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    weidagang2046的專欄

    物格而后知致
    隨筆 - 8, 文章 - 409, 評論 - 101, 引用 - 0
    數(shù)據(jù)加載中……

    如何使用線程

    Java平臺從開始就被設(shè)計成為多線程環(huán)境。在你的主程序執(zhí)行的時候,其它作業(yè)如碎片收集和事件處理則是在后臺進(jìn)行的。本質(zhì)上,你可以認(rèn)為這些作業(yè)是線程。它們正好是系統(tǒng)管理線程,但是無論如何,它們是線程。線程使你能夠定義相互獨(dú)立的作業(yè),彼此之間互不干擾。系統(tǒng)將交換這些作業(yè)進(jìn)或出CPU,這樣(從外部看來)它們好象是同時運(yùn)行的。

    在你需要在你的程序中處理多個作業(yè)時,你也可以使用多個進(jìn)程。這些進(jìn)程可以是你自己創(chuàng)建的,你也可以操縱系統(tǒng)線程。

    你進(jìn)行這些多作業(yè)處理,要使用幾個不同的類或接口:

    java.util.Timer類 
    javax.swing.Timer類 
    Thread類 
    Runnable接口 
    對于簡單的作業(yè),通常需要重復(fù)的,你可以使用java.util.Timer類告訴它“每半秒鐘做一次”。注意:大多數(shù)系統(tǒng)例程是使用毫秒的。半秒鐘是500毫秒。

    你希望Timer實(shí)現(xiàn)的任務(wù)是在java.util.TimerTask實(shí)例中定義的,其中運(yùn)行的方法包含要執(zhí)行的任務(wù)。這些在Hi類中進(jìn)行了演示,其中字符串“Hi”重復(fù)地被顯示在屏幕上,直到你按Enter鍵。

    1. import java.util.*;
    2. public class Hi {
    3.    public static void main(String args[]) 
    4.          throws java.io.IOException {
    5.      TimerTask task = new TimerTask() {
    6.        public void run() {
    7.          System.out.println("Hi");
    8.        }
    9.      };
    10.      Timer timer = new Timer();
    11.      timer.schedule(task, 0, 500);
    12.      System.out.println("Press ENTER to stop");
    13.      System.in.read(new byte[10]);
    14.      timer.cancel();
    15.    }
    16. }

    Java Runtime Environment工作的方式是只要有一個線程在運(yùn)行,程序就不退出。這樣,當(dāng)取消被調(diào)用,沒有其它線程在運(yùn)行了,則程序退出。有一些系統(tǒng)線程在運(yùn)行,如碎片收集程序。這些系統(tǒng)線程也被稱為后臺線程。后臺線程的存在不影響運(yùn)行環(huán)境被關(guān)閉,只有非后臺線程保證運(yùn)行環(huán)境不被關(guān)閉。

    Javax.swing.Timer類與java.util.timer類的工作方式相似,但是有一些差別需要注意。第一,運(yùn)行的作業(yè)被ActionListener接口的實(shí)現(xiàn)來定義。第二,作業(yè)的執(zhí)行是在事件處理線程內(nèi)部進(jìn)行的,而不象java.util.Timer類是在它的外部。這是很重要的,因?yàn)樗P(guān)系到Swing組件集是如何設(shè)計的。

    如果你不熟悉Swing,它是一組可以被Java程序使用的圖形組件。Swing被設(shè)計程被稱為單線程的。這意味著對Swing類內(nèi)部內(nèi)容的訪問必須在單個線程中完成。這個特定的線程是事件處理線程。這樣,例如你想改變Label組件的文字,你不能僅僅調(diào)用Jlabel的setText方法。相反,你必須確認(rèn)setText調(diào)用發(fā)生在事件處理線程中,而這正是javax.swing.Time類派的上用場的地方。

    為了說明這第二種情況,下面的程序顯示一個增加的計數(shù)器的值。美半秒鐘計數(shù)器的數(shù)值增加,并且新的數(shù)值被顯示。

    1. import javax.swing.*;
    2. import java.awt.*;
    3. import java.awt.event.*;
    4. public class Count {
    5.    public static void main(String args[]) {
    6.      JFrame frame = new JFrame();
    7.      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    8.      Container contentPane = frame.getContentPane();
    9.      final JLabel label = new JLabel(""JLabel.CENTER);
    10.      label.setFont(new Font("Serif"Font.PLAIN, 36));
    11.      contentPane.add(label, BorderLayout.CENTER);
    12.      ActionListener listener = new ActionListener() {
    13.        int count = 0;
    14.        public void actionPerformed(ActionEvent e) {
    15.          count++;
    16.          label.setText(Integer.toString(count));
    17.        }
    18.      };
    19.      Timer timer = new Timer(500, listener);
    20.      timer.start();
    21.      frame.setSize(300, 100);
    22.      frame.show();
    23.    }
    24. }

    上述程序的結(jié)果是:

     

    萬一你要做的不是一個簡單的重復(fù)作業(yè),java.lang.Thread類就派上了用場。它允許你自己控制基本功能。通過創(chuàng)建Thread的一個子類,你可以使你的系統(tǒng)脫離,并進(jìn)行一個長時間運(yùn)行的作業(yè),如從網(wǎng)絡(luò)上讀取一個文件,而不阻礙你的其它程序的運(yùn)行。這種長時間運(yùn)行的作業(yè)將在run方法中定義。

    第二種方式是創(chuàng)建Thread類的子類并在子類中實(shí)現(xiàn)run方法,或在實(shí)現(xiàn)runnable的類中實(shí)現(xiàn)run方法,并將這個實(shí)現(xiàn)傳遞給Thread的構(gòu)造函數(shù)。

    你可能會問有什么區(qū)別。Java編程語言僅支持單一繼承。如果你設(shè)計的調(diào)用是除了Thread以外的其它類,你可以是你的類實(shí)現(xiàn)Runnable,而它可以是你的作業(yè)被執(zhí)行。否則,你定義Thread的子類來運(yùn)行你的Run方法,在處理過程中不再添加其它操作。

    對于創(chuàng)建Thread子類的第三種情況,下面的程序生成了一個新的線程來計算一個特定URL的字符數(shù),這個URL是通過命令行傳遞進(jìn)來的。在這進(jìn)行過程之中,實(shí)現(xiàn)Runnable的第四種情況被演示,打印出重復(fù)的消息。注意在實(shí)現(xiàn)Runnable的這后一種情況下,你必須提供重復(fù)消息的代碼。你必須同時sleep,以分配時間并完成操作。在兩種情況下,與使用Timer相比較。這段程序的最后一部分包含有你從命令行讀取命令以觸發(fā)程序結(jié)束。注意在系統(tǒng)讀取URL并打印消息的同時,你總可以按Enter鍵結(jié)束程序。

    1. import java.io.*;
    2. import java.net.*;
    3. public class Both {
    4.    public static void main(String args[]) {
    5.      final String urlString = args[0];
    6.      final String message = args[1];
    7.      Thread thread1 = new Thread() {
    8.        public void run() {
    9.          try {
    10.            URL url = new URL(urlString);
    11.            URLConnection connection = 
    12.                url.openConnection();
    13.            InputStreamReader isr = new 
    14.                InputStreamReader(
    15.                    connection.getInputStream());
    16.            BufferedReader reader = new BufferedReader(isr);
    17.            int count = 0;
    18.            while (reader.read() != -1) {
    19.              count++;
    20.            }
    21.            System.out.println("Size is : " 
    22.                + count);
    23.            reader.close();
    24.          } catch (MalformedURLException e) {
    25.            System.err.println("Bad URL: " 
    26.                + urlString);
    27.          } catch (IOException e) {
    28.            System.err.println("I/O Problems");
    29.          }
    30.        }
    31.      };
    32.      thread1.start();
    33.      Runnable runnable = new Runnable() {
    34.        public void run() {
    35.          while(true) {
    36.            System.out.println(message);
    37.            try {
    38.              Thread.sleep(500);
    39.            } catch (InterruptedException e) {
    40.            }
    41.          }
    42.        }
    43.      };
    44.      Thread thread2 = new Thread(runnable);
    45.      thread2.start();
    46.      try {
    47.        System.out.println("Press ENTER to stop");
    48.        System.in.read(new byte[10]);
    49.      } catch (IOException e) {
    50.        System.out.println("I/O problems");
    51.      }
    52.      System.exit(0);
    53.    }
    54. }

    因?yàn)橛卸喾N方式來處理線程,你選用哪種技術(shù)取決于你和你面臨的條件。要成為一個有效的Java編程人員,盡管你通常不必學(xué)習(xí)Java編程語言的所有內(nèi)容和核心庫,但是線程是一個例外。你越早了解線程如何工作和如何使用線程,你將越早了解Java程序如何工作和交互。


     轉(zhuǎn)自:http://www.javaresearch.org/article/showarticle.jsp?column=544&thread=12856

    posted on 2005-04-21 04:09 weidagang2046 閱讀(302) 評論(1)  編輯  收藏 所屬分類: Java

    評論

    # re: 如何使用線程  回復(fù)  更多評論   

    Timer部分對我來說比較新鮮
    2005-04-21 04:10 | weidagang2046
    主站蜘蛛池模板: 国产精品亚洲色图| 中文字幕无码免费久久| 亚洲爽爽一区二区三区| 日韩成人免费视频| 一本色道久久88亚洲精品综合| 日本久久久免费高清| 中国好声音第二季免费播放| 日韩视频免费在线观看| 亚洲日本香蕉视频| 国产av无码专区亚洲国产精品| 99视频在线免费看| 亚洲综合在线观看视频| 日本一区二区免费看| 亚洲人成网站免费播放| 亚洲狠狠婷婷综合久久久久| 在线观看成人免费| a级片免费在线观看| 亚洲国产午夜精品理论片在线播放 | 国产精品亚洲精品日韩已方 | 中文字幕精品无码亚洲字| 在线观看日本亚洲一区| 国产亚洲视频在线播放| 九九九精品成人免费视频| 亚洲欧美日韩一区二区三区| 国产亚洲精AA在线观看SEE| 国产三级免费电影| 亚洲w码欧洲s码免费| 亚洲免费福利在线视频| 日日夜夜精品免费视频| 一区二区三区福利视频免费观看| 亚洲精品在线免费看| 亚洲人成人网站色www| 精品无码无人网站免费视频 | 亚洲性色精品一区二区在线| 亚洲高清国产拍精品26U| 少妇人妻偷人精品免费视频| 一区二区三区在线免费 | 亚洲精品视频免费观看| 亚洲日本va一区二区三区| 亚洲成人高清在线观看| 亚洲av日韩av无码|