2015年4月12日 星期日

JAVA7-課程15

  課程到今天告一段落。從開始學到現在經過了5個月....。
    一、NetBeans 設定連接資料庫
    二、資料庫
    三、執行緒
    四、JDK7版新增加「平行運算」


  一、NetBeans 設定連接資料庫
    ♠開啟專案 File→New Project

     ♠選擇Java   選擇Java Application
     ♠設定專案名稱、專案路徑 與 建立主程式類別
     ♠開啟後,在專案目錄底下有一個 Libraries 加入 資料庫的函式庫
     ♠選擇會使用到的 derby.jar   derbyClient.jar   derbyLocale_zh_TW.jar    derbynet.jar    derbytools.jar
     ♠切換到服務,找到 jdbc:derby://localhost:1527/sample[app on APP]
       此為連接derby資料庫的語法
     ♠按右鍵選擇 連線
     ♠出現APP、Tables、Views、Procedures...等,代表已經連上資料庫
     ♠可以直接在Tables直接點選右鍵,就可以建立「資料表」
     ♠建立欄位,並設定格式內容
       INTEGR 整數型別的資料
       在Constraints裡有 主鍵 、 唯一 、 允許空值...  等 可以勾選設定
     ♠建立第二個欄位
       VARCHAR 字串型別的資料
       可以設定size 不管中英文size都是1

  二、資料庫
    使用關聯性的資料組織起來管理。
    不過,還有另一種管理方式稱為「分散式資料庫」。

    架構:
            field欄位
           record 紀錄
          table  資料表
        database  資料庫

    ♠使用語法連接資料庫
      要import java.sql.*;
      連接資料庫要有url、userName、password資料,其中 url 不同的資料庫,其連接編號都會不同。例如:derby為1527。
      連接資料庫時,必須使用try-catch-finally。
     ♠建立資料表
      SQL語法建立資料表,並放入一個字串方便操作。
      使用executeUpdate來建立資料表。
     ♠一樣使用SQL新增語法。
      使用executeUpdate來增加紀錄。
     ♠檢查資料是否有新增成功。對MEMBER資料表按右鍵,點選View Data。
     ♠資料表的頁面
     ♠查詢資料表
       帶入參數就可以來回查看紀錄

       建立查詢物件時,必須使用executeQuery方法

       利用查詢物件裡的方法來操作紀錄



     ♠使用getInt() 與 getString(),參數可以給數字,代表第幾個欄位

    ♠把查詢條件更改為 性別是 女 的



    ♠SQL語法~更新紀錄 使用executeUpdate()方法

      ♠SQL語法~刪除紀錄 使用executeUpdate()方法


   ♠增加紀錄的另一種寫法
     可以彈性增加紀錄
      原本SQL語法裡 應該要 values(4,\'Ban\',\'男\') 才有辦法新增Ban這筆紀錄,但現在values三個欄位資料都放上「?」的話,就可以直接打上字串來新增,而不需要使用跳脫字元 讓SQL語法成立。


    ♠使用JdbcRowSet連接資料庫,並開啟資料表


  三、執行緒
    JAVA提供一個介面Runnable 與 一個類別Thead 可以實作多執行緒的方法。建議implements Runnable,因為這樣就可以再繼承其他類別。

    ♠建立「可執行緒」Job1物件
       類別 實作 Runnable
     
    ♠建立多執行緒
      Job3 物件 繼承 Thread,所以不需要再用Thread建立執行緒。
      直接 new Job3() 就是執行緒了...

       直接繼承 Thread
       這三個執行緒各自執行迴圈49次

    ♠執行緒存取同一物件相同資源時,會引發「競速情況(Race Condition)」



     ♠另一個 「競速情況(Race Condition)」的例子




    ♠為了解決「競速情況(Race Condition)」的問題,JAVA提供修飾字 synchronized 同步化。
      第一種寫法:synchronized(變數){程式碼區塊}

       第二種寫法:直接當成方法的修飾字 synchronized,同步化方法

       第三種寫法:synchronized(物件){程式碼區塊}

     ♠除此之外,JAVA還提供另一個管道解決「競速情況(Race Condition)」的問題。
      使用locks,建立ReentrantLock物件,來鎖定部分程式碼

    ♠另外,除了鎖定程式區塊之外,JAVA提供另一種方式「原生型態(atomic) 」來保證變數的操作過程不被分割。
      Atomic套件:封裝了一系列的原生型態,並透過這些類別的方法封裝變數的存取過程與一些常見的判斷邏輯,使這些存取操作過程都變成不可分割的運算。
      設定執行緒優先權 setPriorty(1~10),預設為5。
      數字愈大,優先權愈高。

    讓執行緒更靈活...
     ♠使用Object的wait()、notify()或notifyAll(),讓執行緒的操作可以更靈活。這些方法必須寫在有「關鍵字synchronized」的同步化區塊內。




    ♠關於執行緒等待的狀況,JAVA提供兩個類別來操作此情況
      第一個類別:CountDownLatch,一個執行緒 等待 多個執行緒完成工作。
      必須 import java.util.concurrent.CountDownLatch;



      第二個類別:CyclicBarrier,多個執行緒 等待 一個執行緒完成工作
      必須 import java.util.concurrent.CyclicBarrier;




  ♠使用執行緒池,來達成多執行緒的操作。
      使用 ExecutorService 物件,必須 import java.util.concurrent.*;。
      建立執行緒池:
        (1) Executors.newCachedThreadPool(); 會在必要時建立執行緒
        (2) Executors.newFixedThreadPool(); 可在池中指定建立固定數量的執行緒
      當使用執行緒池時,很容易產生Future物件。
      Future物件:可以在將來取得結果。過些時候,再呼叫Future的get()方法取得結果。如果結果已經產生,get()方法會直接返回,否則會進入阻斷直到結果已傳回。
      get()方法可以指定等待結果的時間。若指定的時間內無法傳回結果,就會丟出 java.util.concurrent.TimeoutException。
      可以使用 isDone() 方法,確認結果是否已產生。




    ♠因為介面Runnable不能傳回值,故JAVA提供另一個介面Callable<T>可以傳回值。
      Callable的作用與Runnable類似,可讓你定義想要的執行流程。
      Runnable的run()方法無法傳回值,也無法拋出例外;
      Callable的call()方法可以傳回值,也可以拋出受檢例外。

     ♠測試ExecutorService的invokeAny()方法


      ♠測試ExecutorService的invokeAll()方法


  四、JDK7版新增加「平行運算」
    ♠分而治之(Divide and Conquer)問題,要有實體的多核心CPU
      建立一個一般的遞迴關係式,計算費式數列
      使用「平行運算」
      必須要 import java.util.concurrent.RecursiveTask
      類別 extends RecursiveTask<T>,並實作 compute() 方法
      使用平行運算的執行緒池
      必須 import java.util.concurrent.ForkJoinPool;
      取得CPU數量,建立擁有CPU數量的平行運算執行緒池
      計算費式數列第40項,發現平行運算所花的時間多好多......
     但,計算費式數列第50項時,平行運算所花費的時間就比較少了!

後記:
    1.今天講的東西很多,而且當下也沒有搞懂,只好回家自己找資料慢慢消化。直到5月13日才把資料整理好。
    2.如果要摸熟資料庫,必須要再花時間才能完全瞭解。
    3.多執行緒 與 平行運算 的概念非常深奧,目前不能駕馭它。
    4.找資料的過程中,發現有一個非常好用的網站,名為SlideShare,網址:http://www.slideshare.net/。裡頭有許多投影片可以觀看。

沒有留言:

張貼留言