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

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

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

    guanxf

    我的博客:http://blog.sina.com.cn/17learning

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      71 隨筆 :: 1 文章 :: 41 評論 :: 0 Trackbacks

    #

    Java多線程技術  --作者:楊帆    文章連接:http://express.ruanko.com/ruanko-express_6/webpage/tech4.html
     
    項目經理:楊帆

    多線程編程一直是學員們比較頭痛和心虛的地方,因為線程執行順序的不可預知性和調試時候的困難,讓不少人在面對多線程的情況下選擇了逃避,采用單線程的方式,其實只要我們對線程有了明確的認識,再加上java內置的對多線程的天然支持,多線程編程不再是一道難以逾越的鴻溝。

    進程、線程、并發執行

    首先我們先來認識一下進程、線程、并發執行的概念:

      一般來說,當運行一個應用程序的時候,就啟動了一個進程,當然有些會啟動多個進程。啟動進程的時候,操作系統會為進程分配資源,其中最主要的資源是內存空間,因為程序是在內存中運行的。

    在進程中,有些程序流程塊是可以亂序執行的,并且這個代碼塊可以同時被多次執行。實際上,這樣的代碼塊就是線程體。線程是進程中亂序執行的代碼流程。當多個線程同時運行的時候,這樣的執行模式成為并發執行。

    下面我以一個日常生活中簡單的例子來說明進程和線程之間的區別和聯系:

    雙向多車道道路圖

    這副圖是一個雙向多車道的道路圖,假如我們把整條道路看成是一個“進程”的話,那么圖中由白色虛線分隔開來的各個車道就是進程中的各個“線程”了。

    1. 這些線程(車道)共享了進程(道路)的公共資源(土地資源)。
    2. 這些線程(車道)必須依賴于進程(道路),也就是說,線程不能脫離于進程而存在(就像離開了道路,車道也就沒有意義了)。
    3. 這些線程(車道)之間可以并發執行(各個車道你走你的,我走我的),也可以互相同步(某些車道在交通燈亮時禁止繼續前行或轉彎,必須等待其它車道的車輛通行完畢)。
    4. 這些線程(車道)之間依靠代碼邏輯(交通燈)來控制運行,一旦代碼邏輯控制有誤(死鎖,多個線程同時競爭唯一資源),那么線程將陷入混亂,無序之中。
    5. 這些線程(車道)之間誰先運行是未知的,只有在線程剛好被分配到CPU時間片(交通燈變化)的那一刻才能知道。

    JVM與多線程

    Java編寫的程序都運行在Java虛擬機(JVM)中,在JVM的內部,程序的多任務是通過線程來實現的。

    每用java命令啟動一個java應用程序,就會啟動一個JVM進程。在同一個JVM進程中,有且只有一個進程,就是它自己。在這個JVM環境中,所有程序代碼的運行都是以線程來運行的。JVM找到程序的入口點main(),然后運行main()方法,這樣就產生了一個線程,這個線程稱之為主線程。當main方法結束后,主線程運行完成。JVM進程也隨即退出。

    操作系統將進程線程進行管理,輪流(沒有固定的順序)分配每個進程很短的一段時間(不一定是均分),然后在每個進程內部,程序代碼自己處理該進程內部線程的時間分配,多個線程之間相互的切換去執行,這個切換時間也是非常短的。

    Java語言對多線程的支持

    Java語言對多線程的支持通過類Thread和接口Runnable來實現。這里就不多說了。這里重點強調兩個地方:

    // 主線程其它代碼段
    ThreadClass subThread = new ThreadClass();
    subThread.start();
    // 主線程其它代碼段
    subThread.sleep(1000);

    有人認為以下的代碼在調用start()方法后,肯定是先啟動子線程,然后主線程繼續執行。在調用sleep()方法后CPU什么都不做,就在那里等待休眠的時間結束。實際上這種理解是錯誤的。因為:

    1. start()方法的調用后并不是立即執行多線程代碼,而是使得該線程變為可運行態(Runnable),什么時候運行是由操作系統決定的。
    2. Thread.sleep()方法調用目的是不讓當前線程獨自霸占該進程所獲取的CPU資源,以留出一定時間給其他線程執行的機會(也就是靠內部自己協調)。

    線程的狀態切換

    前面我們提到,由于線程何時執行是未知的,只有在CPU為線程分配到時間片時,線程才能真正執行。在線程執行的過程中,由可能會因為各種各樣的原因而暫停(就像前面所舉的例子一樣:汽車只有在交通燈變綠的時候才能夠通行,而且在行駛的過程中可能會出現塞車,等待其它車輛通行或轉彎的狀況)。

    這樣線程就有了“狀態”的概念,下面這副圖很好的反映了線程在不同情況下的狀態變化。

    線程在不同情況下的狀態變化

    • 新建狀態(New):新創建了一個線程對象。
    • 就緒狀態(Runnable):線程對象創建后,其他線程調用了該對象的start()方法。該狀態的線程位于可運行線程池中,變得可運行,等待獲取CPU的使用權。
    • 運行狀態(Running):就緒狀態的線程獲取了CPU,執行程序代碼。
    • 阻塞狀態(Blocked):阻塞狀態是線程因為某種原因放棄CPU使用權,暫時停止運行。直到線程進入就緒狀態,才有機會轉到運行狀態。阻塞的情況分三種:
      1. 等待阻塞:運行的線程執行wait()方法,JVM會把該線程放入等待池中。
      2. 同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程占用,則JVM把該線程放入鎖。
      3. 其他阻塞:運行的線程執行sleep()或join()方法,或者發出了I/O請求時,JVM會把該線程置為阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉入就緒狀態。
    • 死亡狀態(Dead):線程執行完了或者因異常退出了run()方法,該線程結束生命周期。

    Java中線程的調度API

    Java中關于線程調度的API最主要的有下面幾個:

    1. 線程睡眠:Thread.sleep(long millis)方法
    2. 線程等待:Object類中的wait()方法
    3. 線程讓步:Thread.yield() 方法
    4. 線程加入:join()方法
    5. 線程喚醒:Object類中的notify()方法

    關于這幾個方法的詳細應用,可以參考SUN的API。這里我重點總結一下這幾個方法的區別和使用。

    sleep方法與wait方法的區別:

    1. sleep方法是靜態方法,wait方法是非靜態方法。
    2. sleep方法在時間到后會自己“醒來”,但wait不能,必須由其它線程通過notify(All)方法讓它“醒來”。
    3. sleep方法通常用在不需要等待資源情況下的阻塞,像等待線程、數據庫連接的情況一般用wait。

    sleep/wait與yeld方法的區別:調用sleep或wait方法后,線程即進入block狀態,而調用yeld方法后,線程進入runnable狀態。

    wait與join方法的區別:

    1. wait方法體現了線程之間的互斥關系,而join方法體現了線程之間的同步關系。
    2. wait方法必須由其它線程來解鎖,而join方法不需要,只要被等待線程執行完畢,當前線程自動變為就緒。
    3. join方法的一個用途就是讓子線程在完成業務邏輯執行之前,主線程一直等待直到所有子線程執行完畢。

    通過上面的介紹相信同學們對java里面的多線程已經有了基本的了解和認識。其實多線程編程并沒有大家想象中的那么難,只要在實際的學習,工作當中不斷的加以練習和使用,相信大家很快就能掌握其中的奧妙,從而編寫出賞心悅目的java程序。


    posted @ 2015-04-11 17:31 管先飛 閱讀(268) | 評論 (0)編輯 收藏

    1、多表級聯刪除:
    ---DELETE---
    DELETE from a_msg_push,a_announcement
    using a_msg_push,a_announcement
    where  a_msg_push.announcement_id=a_announcement.id and a_announcement.Create_time<'2014-11-19 23:59:59';

    2、子查詢刪除:
    -----------delete--------
    DELETE From  t_repeat  where t_repeat.id in(
    SELECT tb.id from (
    SELECT *  from t_repeat   t 
    where 
    1=1
    and 
    (t.cid,t.uid ) in (select t1.cid,t1.uid from t_repeat t1 group by t1.cid,t1.uid having count(*) > 1) 
    and 
    t.id  not in (select min(t2.id) from t_repeat t2 group by t2.cid,t2.uid having count(*)>1) 
    ) as tb )

    3、子表刪除:
    -----------delete--------
    DELETE From  t_repeat  where t_repeat.id  not in
       SELECT tb.id from(
    select  a.id from t_repeat a where a.id =(
    select   max(b.id) from t_repeat b where a.cid=b.cid and a.uid=b.uid
       )as tb
    )
    posted @ 2015-03-01 22:52 管先飛 閱讀(2554) | 評論 (0)編輯 收藏

    感謝廖雪峰為大家提供這么好的免費教程,主要目錄如下:
    Git教程

    posted @ 2014-10-20 10:59 管先飛 閱讀(239) | 評論 (0)編輯 收藏

    gooole瀏覽器內核已經有webkit內核移步到Bilnk開發屬于Chromium Projects 的版本,下面為完整教程。

    目錄

    1. Blink's Mission:
    2. Participating
      1. 2.1 Discussions
      2. 2.2 Watching for new features
      3. 2.3 Committing and reviewing code
      4. 2.4 Developing Blink
      5. 2.5 How do I port Blink to my platform?
    3. Web Platform Changes: Guidelines
      1. 3.1 Scope
      2. 3.2 Policy for shipping and removing web platform API features
      3. 3.3 Trivial Changes
      4. 3.4 Vendor Prefixes
    4. Web Platform Changes: Process
      1. 4.1 Launch Process: New Features
      2. 4.2 Launch Process: Deprecation
      3. 4.3 API Owners
      4. 4.4 API Review
      5. 4.5 Feature Dashboard
      6. 4.6 Guiding Principles for Process
    5. Testing
    6. Architectural Changes
    7. Developer FAQ
    8. Subpage Listing
      友情連接:
      https://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html
    posted @ 2014-10-19 21:09 管先飛 閱讀(339) | 評論 (0)編輯 收藏

    如下兩條常用sql,統計分類數據,你能說出區別嗎?
    一、常用sql一:
    select 
    r.cid,
    r.depart_id,
    r.employ_id,
    r.create_by,
    count(DISTINCT r.form_type) as dailyReportNum
    FROM 
    report r
    where 
    1=1 
    GROUP BY 
    r.employ_id

    二、常用sql二:
    select 
    r.cid,
    r.depart_id,
    r.employ_id,
    r.create_by,
    sum(case WHEN df.form_type=1 then 1 else 0 end ) as dailyReportNum
    FROM 
    report r
    where 
    1=1 
    GROUP BY 
    r.employ_id


    posted @ 2014-09-18 17:05 管先飛 閱讀(3593) | 評論 (4)編輯 收藏

    HSSF和XSSF的區別:
    http://poi.apache.org/spreadsheet/index.html
    POI官方詳情教程:
    http://poi.apache.org/spreadsheet/quick-guide.html

    Index of Features

    posted @ 2014-09-18 12:24 管先飛 閱讀(3815) | 評論 (2)編輯 收藏

    現階段JAVA操作Excel的JAR主要有apache 的POI及jxl.Jxl方便快捷,POI用于對復雜Excel的操作。

    Jxl官網:http://www.andykhan.com/jexcelapi/index.html


    一、Jxl的API

    Jxl的API主要有三個包,jxl,jxl.format,jxl.write。如果單獨的分析API,可能對于更明確的了解此API沒有太多的幫助,我們還是從Excel文件的層次來剝離此API吧。

    一個excel文件由一個工作簿組成,一個工作簿又由n個工作表組成,每個工作表又由多個單元格組成。對應于Jxl中的結構為

    讀文件(包jxl)

    寫文件(包jxl.write)

    說明

    Workbook 

    WritableWorkbook

    工作簿

    Sheet

    WritableSheet

    工作表

    Cell/Image/Hyperlink

    WritableCell/WritableImage//WritableHyperlink

    單元格/圖像/超鏈接

           單元格(此處指文本單元格,圖像及鏈接和單元格做為一個層次)分為好多種,所以在API的設計中將Cell作為一個接口而存在。 對應的jxl中的結構為:

    讀文件(包jxl)

    寫文件(包jxl.write)

    說明

    Cell

    WritableCell

    單元格

    BooleanCell

    Boolean

    布爾值單元格

    DateCell

    DateTime

    時間單元格

    ErrorCell

     

    形式錯誤的單元格

    LabelCell

    Label

    文本單元格

    NumberCell

    Number

    數字單元格

    FormualCedll

    Formual

    公式單元格

     

    Blank

    空格單元格

    BooleanFormualCell

     

    布爾公式單元格

    DateFormualCell

     

    時間公式單元格

    ErrorFormualCell

     

    錯誤公式單元格

    StringFormualCell

     

    文本公式單元格

    NumberFormualCell

     

    數字公式單元格

     

    而有的時候,我們可能將幾個單元格作為一個整體來處理,在API中對應的則是:

        jxl.Range 

     

        雖然數據是電子表格的核心,但是同時其也需要一些輔助類,比如文件格式設置,工作表設置與顯示效果,單元格設置與顯示效果等。按照其層次,則依次有以下接口或類。

    讀文件(包jxl)

    寫文件(包jxl.write)

    說明

    WorkbookSettings

    WorkbookSettings(包jxl)

    設置workbook屬性的bean

    SheetSettings

    SheetSettings(包jxl)

    設置具體sheet的屬性的bean(比如表頭表底等)

    HeaderFooter

    HeaderFooter(包jxl)

    表示表頭表底類

    HeaderFooter.Contents

    HeaderFooter.Contents(包jxl)

    具體表頭表底設置

    CellFeatures

    WritableCellFeautres

    表格內容相關設置(驗證)

    CellReferenceHelper

     

    得到引用單元格相關屬性

    CellType

     

    表格相關類型

    CellView

    CellView(包jxl)

    表格視圖相關設置

    CellFormat

    WritableCellFormat

    表格顯示樣式設置

     

    BoldStyle

    邊框枚舉

     

    DateFormat

    時間格式

     

    DateFormats

    時間格式枚舉

     

    NumbreFormat

    數據格式

     

    NumbreFormats

    數字模式枚舉

     

    WritableFont

    字體設置

     

    WriteableFont.Fontname

    靜態字體內部類

     

    最后,關于Jxl.format包,此包主要是一些與具體樣式有關的接口和枚舉,不進行具體描述。
    文章摘自:http://blog.csdn.net/surgent/article/details/5836580

    posted @ 2014-09-18 09:21 管先飛 閱讀(2005) | 評論 (0)編輯 收藏

     網絡盒子目前市面上主流的有小米盒子、樂視盒子、Uhost、天貓盒子,各種盒子的功能都差不多,現以小米盒子為列簡單描述一下小米盒子。
    一、小米盒子的最新功能:
    1、觀看各種大片電影、電視劇。
    2、各種手游、教育培訓。
    二、小米盒子的缺陷:
    1、用戶直觀搜索相關的視頻太困難,搜索功能太局限。
    2、網絡電視不支持,不過現在可以安裝其他視頻軟件來觀看網絡電視。
    3、對手機端的安卓apk支持不好。
    三、小米盒子的潛力:
    1、小米盒子的操作系統采用andriod操作系統,以后可以包含手機上有的一切功能。
    2、以后在游戲、教育、影院、購物比手機更有發展潛力。
    四、小米盒子的使用技巧:
    1、小米盒子最新miniui已經支持root,所以可以安裝一切安卓應用(安裝方法類似手機)。
    2、小米盒子系統更新保持網絡暢通。
    4、可以將手機片源用電視播放,也可用手機玩游戲。
    簡單寫幾個小文字睡覺,希望幫電視盒子打打廣告,以后希望盒子發展得更好,豐富用戶余業觀看在客廳的娛樂體驗。
    posted @ 2014-06-15 01:34 管先飛 閱讀(2002) | 評論 (10)編輯 收藏

         摘要: package org.jeecgframework.core.util.excel;import java.awt.image.BufferedImage;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.IOException;import java.lang.reflect.Field;import...  閱讀全文
    posted @ 2014-05-29 11:14 管先飛 閱讀(7872) | 評論 (0)編輯 收藏

    JSON轉換的四種各種情況:

    1. //把java 對象列表轉換為json對象數組,并轉為字符串

        JSONArray array = JSONArray.fromObject(userlist);
        String jsonstr = array.toString();

    2.//把java對象轉換成json對象,并轉化為字符串

      JSONObject object = JSONObject.fromObject(invite);
       String str=object.toString());

    3.//把JSON字符串轉換為JAVA 對象數組

      String personstr = getRequest().getParameter("persons");
      JSONArray json = JSONArray.fromObject(personstr);
      List<InvoidPerson> persons = (List<InvoidPerson>)JSONArray.toCollection(json, nvoidPerson.class);
    4.//把JSON字符串轉換為JAVA 對象

      JSONObject jsonobject = JSONObject.fromObject(str);
      PassportLendsEntity passportlends = null;
      try {
       //獲取一個json數組
       JSONArray array = jsonobject.getJSONArray("passports");
       //將json數組 轉換成 List<PassPortForLendsEntity>泛型
       List<PassPortForLendsEntity> list = new ArrayList<PassPortForLendsEntity>();
       for (int i = 0; i < array.size(); i++) {   
                JSONObject object = (JSONObject)array.get(i);  
                PassPortForLendsEntity passport = (PassPortForLendsEntity)JSONObject.toBean(object,
                  PassPortForLendsEntity.class);
                if(passport != null){
                 list.add(passport);
                }  
         }
       //轉換PassportLendsEntity 實體類
      passportlends = (PassportLendsEntity)JSONObject.toBean(jsonobject, PassportLendsEntity.class);

      str = "{\"lendperson\":\"李四\",\"lendcompany\":\"有限公司\",\"checkperson\":\"李四\",

      \"lenddate\":\"2010-07-19T00:00:00\",\"lendcounts\":4,\"
      passports\":[{\"passportid\":\"d\",\"name\":\"李豫川\",\"passporttype\":\"K\"},
      {\"passportid\":\"K9051\",\"name\":\"李平\",\"passporttype\":\"K\"},
      {\"passportid\":\"K90517\",\"name\":\"袁寒梅\",\"passporttype\":\"K\"},
      {\"passportid\":\"K905199\",\"name\":\"賀明\",\"passporttype\":\"K\"}]}";
    相關的jar包:

    posted @ 2014-04-16 01:11 管先飛 閱讀(2752) | 評論 (0)編輯 收藏

    僅列出標題
    共7頁: 上一頁 1 2 3 4 5 6 7 下一頁 
    主站蜘蛛池模板: 国产在线观看免费av站| 亚洲AV无码成人网站在线观看| 深夜福利在线免费观看| 国产成人免费高清在线观看| 亚洲人成欧美中文字幕| 免费看AV毛片一区二区三区| 亚洲综合激情五月丁香六月 | 中文字幕久精品免费视频| 亚洲日韩在线观看| 精品一区二区三区免费观看| 亚洲精品一品区二品区三品区| 香蕉免费看一区二区三区| 亚洲成a人片77777kkkk| 国产好大好硬好爽免费不卡| 亚洲精品视频观看| 成年18网站免费视频网站| 国产成人人综合亚洲欧美丁香花 | 久久免费视频99| 亚洲精品福利网泷泽萝拉| 成年美女黄网站色大免费视频| 亚洲熟女综合色一区二区三区| 国产成人一区二区三区免费视频 | 亚洲第一永久在线观看| 国产一精品一AV一免费孕妇| 亚洲aⅴ无码专区在线观看春色 | 亚洲成a人片在线观看中文动漫 | 亚洲国产理论片在线播放| 日韩视频免费在线| 国产视频精品免费视频| 亚洲最大免费视频网| 国产一级淫片a免费播放口之 | 一级日本高清视频免费观看| 亚洲精品视频在线| 免费看片免费播放| 你懂得的在线观看免费视频| 亚洲伊人色一综合网| 久久乐国产精品亚洲综合| ww4545四虎永久免费地址| 免费国产黄网站在线观看动图 | 怡红院免费的全部视频| 亚洲精品国产国语|