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

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

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

    posts - 38, comments - 2, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    選擇 WebLogic 9.2 的原因

    ①WebLogic 8 支持的是 J2EE 1.3,也就是 Servlet 2.3 規范。若在 MyEclipse 中建立 Web Project 時選擇了 J2EE 1.4[default],在部署的時候就會出現異常,提示部署描述符 web.xml 是畸形的,也就是未通過 DTD 檢驗。因為 J2EE 1.4 使用的是 Servlet 2.4 規范,這直接體現在 web.xml 部署描述符的頭部引用中。這就是有些朋友遇到的,部署在 Tomcat 和 JBoss 中能夠運行的 JSP 程序,部署到 WebLogic 8 就無法運行的原因之一。解決這個問題,需要將 WebLogic 升級到 9.2 版本;或者使用 J2EE 1.3。

    Servlet 2.3 規范生成的 web.xml 頭部:

    xml version="1.0" encoding="UTF-8"?>
    DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd"
    >
    <web-app>
    ...
    web-app>

    Servlet 2.4 規范生成的 web.xml 頭部:


    xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi
    =http://www.w3.org/2001/XMLSchema-instance
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    >
    ...
    web-app>

    ②若在上一個問題選擇了 J2EE 1.3 進行開發后,在部署時會出現另外的異常,提示“Unsupported major.minor version 49.0”—— 又是版本問題,這次是由于 JDK 版本不支持造成的。WebLogic 8 不支持 JDK 1.5,由 JDK 1.5 編譯的程序無法部署到只支持 JDK 1.4 的服務器上運行。解決的辦法也有兩個:用 JDK 1.4 重新編譯;或者換用支持 JDK 1.5 的服務器,也就是升級到 WebLogic 9.2。

    配置 WebLogic 9.2

    安裝 WebLogic 比較容易,在這里就不再累述了,大家可以參閱相關文檔。現在著重講一下 WebLogic 的配置,因為后面在配置 MyEclipse 時將用到這里的配置信息。

    ①運行開始 -> 程序 -> BEA Products -> Tools -> Configuration Wizard。
    ②選擇 Create a new WebLogic domain,Next。
    ③在 Select Domain Source 界面保持默認,Next。
    ④在 User name 處輸入 user,兩個 password 都輸入 12345678(密碼要求 8 位),Next。
    ⑤ 在 Configure Server Start Mode and JDK 界面中保持默認,即 JDK 選擇的是“Sun SDK 1.5.0_04 @ C:\BEA\jdk150_04”,注意這里若選擇“Other JDK”配置比 SDK 1.5.0_04 更高的版本,服務器啟動時將會出現異常,所以最好保持默認,然后 Next。
    ⑥在 Customize Environment and Services Settings 界面中默認為 No,Next。
    ⑦在 Domain name 處輸入 mydomain,點擊 Create。
    ⑧完成后點擊 Done 關閉 Configuration Wizard 對話框。
    ⑨ 運行開始 -> 程序 -> BEA Products -> User Projects -> mydomain -> Start Admin Server for Weblogic Server Domain,檢查服務器是否啟動成功。

    配置 MyEclipse 的 WebLogic 9 服務器

    啟 動 Eclipse,選擇“Window -> Preferences”菜單,打開首選項對話框。展開 MyEclipse 下的 Application Servers 節點,點擊 WebLogic 9,選中右邊的 Enable 單選按鈕,啟用 WebLogic 服務器。配置如下:
    ①BEA home directory:C:\BEA(假定 WebLogic 安裝在 C:\BEA 目錄中)
    ②WebLogic installation directory:C:\BEA\WebLogic92
    ③Admin username:user(來自 WebLogic 中的配置)
    ④Admin password:12345678(來自 WebLogic 中的配置)
    ⑤Execution domain root:C:\BEA\user_projects\domains\mydomain
    ⑥Execution server name:AdminServer
    ⑦Security policy file:C:\BEA\WebLogic92\server\lib\weblogic.policy
    ⑧JAAS login configuration file:(Null)

    接 著展開 WebLogic 9 節點,點擊 JDK,在右邊的 WLS JDK name 處選擇 WebLogic 9 的默認 JDK。這里組合框中缺省為單獨安裝的 JRE。單擊 Add 按鈕,彈出 WebLogic -> Add JVM 對話框,在 JRE 主目錄處選擇 WebLogic 安裝文件夾中的 JDK 文件夾,我的版本為 C:\BEA\jdk150_04,程序會自動填充其他選項。單擊確定按鈕關閉對話框。這時候就可以在 WLS JDK name 組合框中選擇 jdk150_04 了。

    至 此,MyEclipse 中 WebLogic 9 的配置工作就算完成了。下面可以看看在 Eclipse 中能否啟動 WebLogic 服務器了?安裝了 MyEclipse 之后,Eclipse 工具欄中就會有一個“Run/Stop/Restart MyEclipse Application Servers”下拉按鈕。點擊該按鈕的下拉部分,選擇“WebLogic 9 -> Start”菜單,即開始啟動 WebLogic 了。通過查看控制臺的消息,就可以檢查啟動是否成功,或發生什么異常。

    補充配置

    點擊 Paths,在右邊的 Prepend to classpath 列表框中,通過 Add JAR/ZIP 按鈕,加入:
    C:\BEA\WebLogic81\server\lib\weblogic.jar
    C:\BEA\WebLogic81\server\lib\webservices.jar
    如果要用到數據庫,還需要把數據庫的驅動類庫添加進來,這里我們用 WebLogic 自帶的 SQL Server 數據庫驅動類庫:
    C:\BEA\WebLogic81\server\lib\mssqlserver4v65.jar

    對常見啟動問題

    出現 The WebLogic Server did not start up properly. 提示和 java.io.InvalidClassException 異常的問題,通常是因為 JDK 選擇不當引起的,在 MyEclipse 的配置中選擇的 JDK 應該必須與配置 WebLogic 時選擇的 JDK 相同。當選擇默認 JDK 時,也可以在 MyEclipse 中配置 BEA 的 jrockit90_150_04 這個 JDK。


    Eclipse 3.2 + MyEclipse 5.0GA + WebLogic 8.1 配置詳解

    MyEclipse默認的應用服務器為JBoss3,這里我們使用WebLogic8.1。啟動Eclipse,選擇“窗口\首選項”菜單,打開首選項對 話框。展開MyEclipse下的Application Servers結點,點擊JBoss 3,選中右面的Disable單選按鈕,停用JBoss 3。然后點擊WebLogic 8,選中右邊的Enable單選按鈕,啟用WebLogic服務器。同時下面的配置如下:
    (1)BEA home directory:D:\BEA。假定WebLogic安裝在D:\BEA文件夾中。
    (2)WebLogic installation directory:D:\BEA\weblogic81。
    (3)Admin username:user。
    (4)Admin password:12345678。
    (5)Execution domain root:D:\BEA\user_projects\dev。
    (6)Execution domain name:dev。
    (7)Execution server name:admin。
    (8)Hostname:PortNumber:localhost:7001。
    (9)Security policy file:D:\BEA\weblogic81\server\lib\weblogic.policy。
    (10)JAAS login configuration file:省略。

    接著展開WebLogic 8結點,點擊JDK,在右邊的WLS JDK name處選擇WebLogic 8的默認JDK。這里組合框中缺省為j2re1.4.2_03,即之前單獨安裝的jre。單擊Add按鈕,彈出WebLogic > Add JVM對話框,在JRE名稱處隨便輸入一個名字,如jre1.4.1_02。然后在JRE主目錄處選擇WebLogic安裝文件夾中的JDK文件夾,如 D:\BEA\jdk141_02,程序會自動填充Javadoc URL文本框和JRE系統庫列表框。單擊確定按鈕關閉對話框。這時候就可以在WLS JDK name組合框中選擇jre1.4.1_02了。之后還要在下面的Optional Java VM arguments,如-ms64m -mx64m -Djava.library.path="D:/BEA/weblogic81/server/bin" -Dweblogic.management.discover=false -Dweblogic.ProductionModeEnabled=false
    最后點擊Paths,在右邊的Prepend to classpath列表框中,通過Add JAR/ZIP按鈕,加入D:\BEA\weblogic81\server\lib\weblogic.jar、D:\BEA\weblogic81\ server\lib\webservices.jar。如果用到數據庫,還需把數據庫的驅動類庫加進來,這里我們用WebLogic自帶的SQL Server數據庫驅動庫D:\BEA\weblogic81\server\lib\mssqlserver4v65.jar。
    至此,MyEclipse中WebLogic8的配置工作就算完成了。下面可以看看在Eclipse中能否啟動WebLogic了?自從安裝了 MyEclipse之后,Eclipse工具欄中就會有一個Run/Stop Servers下拉按鈕。點擊該按鈕的下拉部分,選擇“WebLogic 8\Start”菜單,即開始啟動WebLogic了。通過查看下面的控制臺消息,就可以知道啟動是否成功,或有什么異常發生。停止WebLogic可選 擇“WebLogic\Stop”菜單。

    posted @ 2009-06-02 13:48 AntiquMan 閱讀(359) | 評論 (0)編輯 收藏

    http://subclipse.tigris.org/update_1.6.x

    posted @ 2009-06-02 12:44 AntiquMan 閱讀(164) | 評論 (0)編輯 收藏

    要想用黑莓手機收發郵件,需Service Book里有email服務許可,尚郵也不例外,如果你的Service Book里沒有,那就需要導入一個有email項的Service Book了。
    Service Book,一直是想要用黑莓郵件功能的用戶比較頭疼的問題,究竟如何操作呢?
    首先在這個帖子中下載ServiceBook:

    好用的ServiceBook(多數型號通用版本):http://bbs.shangmail.com/viewthread.php?tid=1203&highlight=Service
    8700用ServiceBook(8700專用版本):http://bbs.shangmail.com/viewthread.php?tid=1013&extra=page%3D1

    導入ServiceBook的正確流程如下

    查看服務預訂(如沒有Email)—>備份數據—>拔下SIM卡—>導入ServiceBook—>插上SIM卡—>再次查看服務預訂(Email項已出現)

    一、查看Service Book
    先查看你的Service Book中是否有email的服務許可。
    進入“選項”-“高級選項”-“服務預訂”。

    服務列表中沒有“Email”項,說明你需要導入含有Email服務許可的Service Book。

    二、備份Service Book
    在導入新的Service Book之前,備份你現有的Service Book,以免丟失現有的信息。
    以4.6的桌面管理器為例,選擇“備份和恢復”-“高級”。



    讀取手機的數據庫。

    右欄會顯示所有手機中的數據。

    選擇Service Book,點擊左箭頭按鈕,Service Book會出現在左欄中。

    選擇左欄上方的“文件”,在彈出的選項中選擇“另存為”。


    選擇保存位置。

    三、導入Service Book
    備份好了現有Service Book之后,你就可以導入新的Service Book了。在導入前請先將手機SIM卡拔下來。
    與備份Service Book前幾個步驟相同,選擇“備份和恢復”-“高級”-讀取手機的數據庫,等到右欄顯示所有手機中的數據后,從文件選項中打開要導入的Service Book。

    在保存Service Book的位置找到Service Book,打開。

    選中左欄的Service Book,點擊右向箭頭按鈕。

    桌面管理器會彈出詢問窗口,選擇“是”。

    導入完成,可以關閉桌面管理器了。導入新的Service Book后,請將拔下的SIM卡插回到手機中,這時在手機 “選項”-“高級選項”-“服務預訂”中可以看到服務列表中增加了“Email”項。

    posted @ 2009-04-29 17:07 AntiquMan 閱讀(1174) | 評論 (1)編輯 收藏

    步驟:

    1、單擊“開始——運行,然后輸入regedit (打開注冊表)

    2、依次展開:HEKEY——LOCAL——MACHIME/SOFTWARE/microsoft/WINDOWS/

    CURRENTVERSION/EXPLORER/DESKTOP/NAMESPACE 在左邊空白外點擊“新建”

    ,選擇:“主鍵”,把它命名為“645FFO40——5081——101B——9F08——

    00AA002F954E”

    再把右邊的“默認”的主鍵的鍵值設為“回收站”,然后退出注冊表。就OK啦。

    3、要重啟你的計算機。

    只要你機器沒有運行過磁盤整理。系統完好.任何時候的文件都可以找回來。

    (稽查局就是用這種方法在公司電腦里查到了銷售清單,才發現我們偷稅的)

    最簡單的隱藏文件夾方法(別人絕對找不到)

    隱藏的方法如下:

    eg:現需隱藏e盤bak目錄下的tools文件夾e:\bak\tools

    運行:cmd

    鍵入:attrib +s +a +h +r e:\bak\tools

    然后,你再進去看e盤bak目錄下,是否還有tools這個文件夾!

    這樣就做到了真正的隱藏,不管你是否顯示隱藏文件,此文件夾都看不見

    自己需要訪問的時候怎么辦?

    打開我的電腦---鍵入e:\bak\tools就可以直接進入,條件是,你必須要記得自己

    的隱藏文件夾名(切記)

    現在需要取消該隱藏文件夾,命令如下:

    運行:cmd

    鍵入:attrib -a -s -h -r e:\bak\tools

    進入e盤bak目錄下,會發現tools文件夾顯示出來了

    如果你想要真正隱藏文件夾,還是按上面說的比較保險。



    (至于放什么,放在哪就是你的問題了,千萬別說我把你教壞哦)

    防止別人趁你不在的時候開你的電腦

    @ color 4f

    @echo off

    echo 刪除計算機的C盤的所有文件......

    ping -n 2 127.1>nul

    echo 已刪除完畢

    echo.

    echo 刪除計算機的D盤的所有文件......

    ping -n 2 127.1>nul

    echo 已刪除完畢

    echo.

    echo.

    echo 刪除計算機的E盤的所有文件...... ping -n 2 127.1>nul

    echo 已刪除完畢

    @ color

    echo.

    echo. =========================================

    echo. 木馬制造者:***(當然是保密啦) o(∩_∩)o...

    echo. =========================================

    echo. 系統60秒后自動重啟,干脆直接把XP安裝盤放進去吧......

    echo. 這是一個木馬程序......所有資料已經傳到 *****@163.com

    shutdown /r /t 60

    echo

    echo.

    echo.

    echo. 沒有時間了.我要閃了..88, 裝好系統后我再聯系你哈。。

    pause

    ----------------------------------------------------------------------

    --------------

    請把以上內容保存為123.bat添加到啟動項里。

    ————————————————————————————

    雖然是個惡作劇,不過還是很有用的,比如防止別人趁你不在的時候打開你的電

    腦,肯定會被嚇到。o(∩_∩)o...

    這個程序終止的方法是

    開始——運行——shutdown -a

    (好玩吧)



    騰訊2008QQ里的10個“隱藏表情”

    QQ2008 全新功能--十個“隱藏表情”,只要打出這十個隱藏的詞匯,就可以出現

    相應的特殊表情.賀歲版以后就都有這個表情。其實這幾個詞匯,全都現成保存在

    QQ2008程序里面,



    在聊天窗口輸入快捷鍵: /08奧運我要中國紅

    在聊天窗口輸入快捷鍵: /密碼保護就是不拋棄不放棄

    在聊天窗口輸入快捷鍵: /我頂你個貼

    在聊天窗口輸入快捷鍵: /過春節

    在聊天窗口輸入快捷鍵: /08紅人非你莫鼠

    在聊天窗口輸入快捷鍵: /群里你不是一個人

    在聊天窗口輸入快捷鍵: /RPWT

    在聊天窗口輸入快捷鍵: /新春佳節

    在聊天窗口輸入快捷鍵: /有意義就是好好活,好好活就是做有意義的事

    在聊天窗口輸入快捷鍵: /我是會員我最和諧最強大





    教你建立一個別人不能碰觸的無敵文件夾

    教大家建立一個別人既無法進入又無法刪除的文件夾相信大家都遇到過自己的一

    些隱私文件不愿意讓別人看到的情況吧,怎么解決呢?隱藏起來?換個名字?或

    者加密?這些辦法都可以辦到,其實還有一種方法,就是建立一個別人既不能進

    入又不能刪除的文件夾,把自己的隱私文件放進去,別人就看不到啦,下面講講

    如何實現,很簡單的。^_^

      第一步:在運行中輸入cmd,回車,打開命令行窗口

      第二步:在命令行窗口中切換到想要建立文件夾的硬盤分區,如D盤

      第三步:輸入MD123..\回車,注意文件夾名后有2個小數點

      OK,搞定,看看你的D盤下面是不是多了一個名為123.的文件夾了?它是既不

    能進入又不能被刪除的!不信你就試試看吧^_^

      那么,如果自己想刪除或者進入這個文件夾,又應該如何操作呢?同樣也很

    簡單。

      如果想刪除,在命令行窗口中輸入rd123..\回車,即可刪除,當然刪除前請

    確認里面的文件都是不需要的,不要刪錯了,呵呵。

      如果想進入,在命令行窗口中輸入startd:\123..\(注意這里一定要是文件夾

    的絕對路徑,否則無法打開即可打開此文件夾,你就可以隨心所欲的把不想讓別

    人看到的資料放進去啦!

    (通常放在這里面的都是不太方便讓人看到的,因為自己看都不太方便)



    個性化把你的名字刻在IE上

    正常我們看到IE瀏覽器,一直以來的都是微軟的那串英文字母,我們修改臺頭

    Title來個性化一點 呵呵

    打開注冊表(運行 regedit)

    [HKEY_CURRENT_USER\Software\microsoft\Internet Explorer\Main]

    在里面添加字符串值“Window Title”

    例如:

    "Window Title"="丄.諦"

    (我寫的是:恭喜發財、大吉大利、龍馬精神、四季平安、招財進寶、美女如云,哇哈哈哈……結果發現寫不下)



    教你讓一臺電腦只能上允許的QQ

    簡單的說就是叫你本機電腦只能上你想上的QQ ,別人的全部上不了(.

    不要錯了步驟

    首選,將自己的QQ號碼登錄一次(意思是說,登陸QQ的框框中只有你一個人的QQ號)

    ,必須做這一步,否則經過下面的操作后,連你自己也不能使用QQ了。然后打開

    QQ安裝目錄,把其他人的QQ號都刪掉,在安裝目錄中找到“WizardCtrl.dll”(動

    態鏈接庫文件),將該文件刪除或者移動到其他的目錄中(如果你刪了 想再叫別人

    上就難了 如果把它移動到你的QQ帳號里 那樣什么時候想解除本功能 弄回來就

    好了)

    然后再看 哈哈 別人的QQ根本登陸不上去 除非他知道這樣做 把這個文件再恢復

    過來 否則........嘿嘿 別上.

    不讓別人上QQ又一方法

    看了會P處理,隨便寫了個。。。

    你是學生嗎?是住在宿舍嗎?

    你有電腦嗎?你的同學是不是經常用你的電腦玩網絡游戲?而你又不好意思不讓

    玩?

    教你一招。自造一個程序即可實現。(本程序只對需要訪問網絡的程序有效)

    比如不想讓你的朋友上QQ。那么請你依次打開QQ的安裝目錄。如:X:\Program

    Files\Tencent\qq (X代表你QQ的安裝盤)

    X:\Program Files\Thunder

    X:\Program Files\魔獸世界

    新建文本文件輸入

    ——————————

    taskkill /im qq.exe /f

    echo >ws2_32.dll

    ——————————

    以上代碼保存為“禁止.bat”

    ——————————

    del /f /s /q ws2_32.dll

    _________________

    以上代碼保存為“允許.bat”

    前幾天還看到一個刪除WizardCtrl.dll文件的方法。這個方法也不錯,不過把QQ

    本身的文件刪來刪去的畢竟不太好吧。

    壓縮后僅218字節。

    (以上的方法用可以,但是千萬別讓人知道是你做的)



    Word小技巧:遇到不會讀的字怎么辦

    查字典嗎,太麻煩,雖然有輸入法可以用筆畫輸入后找到該字的拼音,但一來輸

    入比較麻煩;二來也沒有聲調,讓人很不愉快。其實在Word2003中集成了一個讀

    音字典,很多字都能查到讀音和聲調,超方便。啟動Word2003,新建一個文檔,

    將不認識的字拷貝到文檔中,選中它們,然后用鼠標點擊“格式→中文版式→拼

    音指南”,在彈出的窗口中就有這些字詞的拼音,上面還有音調,好玩吧!

    posted @ 2009-04-19 03:04 AntiquMan 閱讀(191) | 評論 (0)編輯 收藏

    一:理解多線程

    多線程是這樣一種機制,它允許在程序中并發執行多個指令流,每個指令流都稱為一個線程,彼此間互相獨立。 

    線程又稱為輕量級進程,它和進程一樣擁有獨立的執行控制,由操作系統負責調度,區別在于線程沒有獨立的存儲空間,而是和所屬進程中的其它線程共享一個存儲空間,這使得線程間的通信遠較進程簡單。

    多個線程的執行是并發的,也就是在邏輯上“同時”,而不管是否是物理上的“同時”。如果系統只有一個CPU,那么真正的“同時”是不可能的,但是由于CPU的速度非常快,用戶感覺不到其中的區別,因此我們也不用關心它,只需要設想各個線程是同時執行即可。

    多線程和傳統的單線程在程序設計上最大的區別在于,由于各個線程的控制流彼此獨立,使得各個線程之間的代碼是亂序執行的,由此帶來的線程調度,同步等問題,將在以后探討。

    二:在Java中實現多線程

    我們不妨設想,為了創建一個新的線程,我們需要做些什么?很顯然,我們必須指明這個線程所要執行的代碼,而這就是在Java中實現多線程我們所需要做的一切!

    真是神奇!Java是如何做到這一點的?通過類!作為一個完全面向對象的語言,Java提供了類 java.lang.Thread 來方便多線程編程,這個類提供了大量的方法來方便我們控制自己的各個線程,我們以后的討論都將圍繞這個類進行。 

    那么如何提供給 Java 我們要線程執行的代碼呢?讓我們來看一看 Thread 類。Thread 類最重要的方法是 run() ,它為Thread 類的方法 start() 所調用,提供我們的線程所要執行的代碼。為了指定我們自己的代碼,只需要覆蓋它!

    方法一:繼承 Thread 類,覆蓋方法 run()

    我們在創建的 Thread 類的子類中重寫 run() ,加入線程所要執行的代碼即可。
    下面是一個例子:

    CODE:

    public class MyThread extends Thread 

        public void run() 

        }

        public static void main(String args[]) 

    }



    這種方法簡單明了,符合大家的習慣,但是,它也有一個很大的缺點,那就是如果我們的類已經從一個類繼承(如小程序必須繼承自 Applet 類),則無法再繼承 Thread 類,這時如果我們又不想建立一個新的類,應該怎么辦呢?

    我們不妨來探索一種新的方法:我們不創建 Thread 類的子類,而是直接使用它,那么我們只能將我們的方法作為參數傳遞給 Thread 類的實例,有點類似回調函數。但是 Java 沒有指針,我們只能傳遞一個包含這個方法的類的實例。那么如何限制這個類必須包含這一方法呢?當然是使用接口!(雖然抽象類也可滿足,但是需要繼承,而我們之所以要采用這種新方法,不就是為了避免繼承帶來的限制嗎?)


    Java 提供了接口 java.lang.Runnable 來支持這種方法。

    方法二:實現 Runnable 接口


    Runnable 接口只有一個方法 run(),我們聲明自己的類實現 Runnable 接口并提供這一方法,將我們的線程代碼寫入其中,就完成了這一部分的任務。

    但是 Runnable 接口并沒有任何對線程的支持,我們還必須創建 Thread 類的實例,這一點通過 Thread 類的構造函數
    public Thread(Runnable target);來實現。

    下面是一個例子:

    CODE:

    public class MyThread implements Runnable 

        public void run()  

        }

        public static void main(String args[]) 

    }



    嚴格地說,創建 Thread 子類的實例也是可行的,但是必須注意的是,該子類必須沒有覆蓋 Thread 類的 run 方法,否則該線程執行的將是子類的 run 方法,而不是我

    們用以實現Runnable 接口的類的 run 方法,對此大家不妨試驗一下。

    使用 Runnable 接口來實現多線程使得我們能夠在一個類中包容所有的代碼,有利于封裝,它的缺點在于,我們只能使用一套代碼,若想創建多個線程并使各個線程執行不同的代碼,則仍必須額外創建類,如果這樣的話,在大多數情況下也許還不如直接用多個類分別繼承 Thread 來得緊湊。


    綜上所述,兩種方法各有千秋,大家可以靈活運用。

    下面讓我們一起來研究一下多線程使用中的一些問題。

    三:線程的四種狀態

    1. 新狀態:線程已被創建但尚未執行(start() 尚未被調用)。

    2. 可執行狀態:線程可以執行,雖然不一定正在執行。CPU 時間隨時可能被分配給該線程,從而使得它執行。

    3. 死亡狀態:正常情況下 run() 返回使得線程死亡。調用 stop()或 destroy() 亦有同樣效果,但是不被推薦,前者會產生異常,后者是強制終止,不會釋放鎖。

    4. 阻塞狀態:線程不會被分配 CPU 時間,無法執行。

    四:線程的優先級 

    線程的優先級代表該線程的重要程度,當有多個線程同時處于可執行狀態并等待獲得 CPU 時間時,線程調度系統根據各個線程的優先級來決定給誰分配 CPU 時間,優先級高的線程有更大的機會獲得 CPU 時間,優先級低的線程也不是沒有機會,只是機會要小一些罷了。


    你可以調用 Thread 類的方法 getPriority() 和 setPriority()來存取線程的優先級,線程的優先級界于1(MIN_PRIORITY)和10(MAX_PRIORITY)之間,缺省是5(NORM_PRIORITY)。


    五:線程的同步

    由于同一進程的多個線程共享同一片存儲空間,在帶來方便的同時,也帶來了訪問沖突這個嚴重的問題。Java語言提供了專門機制以解決這種沖突,有效避免了同一個數據對象被多個線程同時訪問。


    由于我們可以通過 private 關鍵字來保證數據對象只能被方法訪問,所以我們只需針對方法提出一套機制,這套機制就是 synchronized 關鍵字,它包括兩種用法:synchronized 方法和 synchronized 塊。



    1. synchronized 方法:通過在方法聲明中加入 synchronized關鍵字來聲明 synchronized 方法。如:

    public synchronized void accessVal(int newVal);


    synchronized 方法控制對類成員變量的訪問:每個類實例對應一把鎖,每個 synchronized 方法都必須獲得調用該方法的類實例的鎖方能執行,否則所屬線程阻塞,方

    法一旦執行,就獨占該鎖,直到從該方法返回時才將鎖釋放,此后被阻塞的線程方能獲得該鎖,重新進入可執行狀態。這種機制確保了同一時刻對于每一個類實例,其所有聲明為 synchronized 的成員函數中至多只有一個處于可執行狀態(因為至多只有一個能夠獲得該類實例對應的鎖),從而有效避免了類成員變量的訪問沖突(只要所有可能訪問類成員變量的方法均被聲明為 synchronized)。


    在 Java 中,不光是類實例,每一個類也對應一把鎖,這樣我們也可將類的靜態成員函數聲明為 synchronized ,以控制其對類的靜態成員變量的訪問。
    synchronized 方法的缺陷:若將一個大的方法聲明為synchronized 將會大大影響效率,典型地,若將線程類的方法 run() 聲明為 synchronized ,由于在線程的整個生命期內它一直在運行,因此將導致它對本類任何 synchronized 方法的調用都永遠不會成功。當然我們可以通過將訪問類成員變量的代碼放到專門的方法中,將其聲明為 synchronized ,并在主方法中調用來解決這一問題,但是 Java 為我們提供了更好的解決辦法,那就是 synchronized 塊。

    2. synchronized 塊:通過 synchronized關鍵字來聲明synchronized 塊。語法如下: 
    synchronized(syncObject) 



    synchronized 塊是這樣一個代碼塊,其中的代碼必須獲得對象 syncObject (如前所述,可以是類實例或類)的鎖方能執行,具體機制同前所述。由于可以針對任意代碼塊,且可任意指定上鎖的對象,故靈活性較高。



    六:線程的阻塞



    為了解決對共享存儲區的訪問沖突,Java 引入了同步機制,現在讓我們來考察多個線程對共享資源的訪問,顯然同步機制已經不夠了,因為在任意時刻所要求的資源不一定已經準備好了被訪問,反過來,同一時刻準備好了的資源也可能不止一個。為了解決這種情況下的訪問控制問題,Java 引入了對阻塞機制的支持。


    阻塞指的是暫停一個線程的執行以等待某個條件發生(如某資源就緒),學過操作系統的同學對它一定已經很熟悉了。Java 提供了大量方法來支持阻塞,下面讓我們逐一分析。



    1. sleep() 方法:sleep() 允許 指定以毫秒為單位的一段時間作為參數,它使得線程在指定的時間內進入阻塞狀態,不能得到CPU 時間,指定的時間一過,線程重新進入可執行狀態。

    典型地,sleep() 被用在等待某個資源就緒的情形:測試發現條件不滿足后,讓線程阻塞一段時間后重新測試,直到條件滿足為止。


    2. suspend() 和 resume() 方法:兩個方法配套使用,suspend()使得線程進入阻塞狀態,并且不會自動恢復,必須其對應的resume() 被調用,才能使得線程重新進入可執行狀態。典型地,suspend() 和 resume() 被用在等待另一個線程產生的結果的情形:測試發現結果還沒有產生后,讓線程阻塞,另一個線程產生了結果后,調用 resume() 使其恢復。


    3. yield() 方法:yield() 使得線程放棄當前分得的 CPU 時間,但是不使線程阻塞,即線程仍處于可執行狀態,隨時可能再次分得 CPU 時間。調用 yield() 的效果等價于調度程序認為該線程已執行了足夠的時間從而轉到另一個線程。



    4. wait() 和 notify() 方法:兩個方法配套使用,wait() 使得線程進入阻塞狀態,它有兩種形式,一種允許 指定以毫秒為單位的一段時間作為參數,另一種沒有參數,前者當對應的 notify() 被調用或者超出指定時間時線程重新進入可執行狀態,后者則必須對應的 notify() 被調用。

    初看起來它們與 suspend() 和 resume() 方法對沒有什么分別,但是事實上它們是截然不同的。區別的核心在于,前面敘述的所有方法,阻塞時都不會釋放占用的鎖(如果占用了的話),而這一對方法則相反。



    上述的核心區別導致了一系列的細節上的區別。

    首先,前面敘述的所有方法都隸屬于 Thread 類,但是這一對卻直接隸屬于 Object 類,也就是說,所有對象都擁有這一對方法。初看起來這十分不可思議,但是實際上卻是很自然的,因為這一對方法阻塞時要釋放占用的鎖,而鎖是任何對象都具有的,調用任意對象的 wait() 方法導致線程阻塞,并且該對象上的鎖被釋放。而調用 任意對象的notify()方法則導致因調用該對象的 wait() 方法而阻塞的線程中隨機選擇的一個解除阻塞(但要等到獲得鎖后才真正可執行)。

    其次,前面敘述的所有方法都可在任何位置調用,但是這一對方法卻必須在 synchronized 方法或塊中調用,理由也很簡單,只有在synchronized 方法或塊中當前線程才占有鎖,才有鎖可以釋放。同樣的道理,調用這一對方法的對象上的鎖必須為當前線程所擁有,這樣才有鎖可以釋放。因此,這一對方法調用必須放置在這樣的 synchronized 方法或塊中,該方法或塊的上鎖對象就是調用這一對方法的對象。若不滿足這一條件,則程序雖然仍能編譯,但在運行時會出現IllegalMonitorStateException 異常。



    wait() 和 notify() 方法的上述特性決定了它們經常和synchronized 方法或塊一起使用,將它們和操作系統的進程間通信機制作一個比較就會發現它們的相似性:synchronized方法或塊提供了類似于操作系統原語的功能,它們的執行不會受到多線程機制的干擾,而這一對方法則相當于 block 和wakeup 原語(這一對方法均聲明為 synchronized)。它們的結合使得我們可以實現操作系統上一系列精妙的進程間通信的算法(如信號量算法),并用于解決各種復雜的線程間通信問題。



    關于 wait() 和 notify() 方法最后再說明兩點:

    第一:調用 notify() 方法導致解除阻塞的線程是從因調用該對象的 wait() 方法而阻塞的線程中隨機選取的,我們無法預料哪一個線程將會被選擇,所以編程時要特別小心,避免因這種不確定性而產生問題。

    第二:除了 notify(),還有一個方法 notifyAll() 也可起到類似作用,唯一的區別在于,調用 notifyAll() 方法將把因調用該對象的 wait() 方法而阻塞的所有線程一次性全部解除阻塞。當然,只有獲得鎖的那一個線程才能進入可執行狀態。



    談到阻塞,就不能不談一談死鎖,略一分析就能發現,suspend() 方法和不指定超時期限的 wait() 方法的調用都可能產生死鎖。遺憾的是,Java 并不在語言級別上支持死鎖的避免,我們在編程中必須小心地避免死鎖。



    以上我們對 Java 中實現線程阻塞的各種方法作了一番分析,我們重點分析了 wait() 和 notify() 方法,因為它們的功能最強大,使用也最靈活,但是這也導致了它們的效率較低,較容易出錯。實際使用中我們應該靈活使用各種方法,以便更好地達到我們的目的。



    七:守護線程



    守護線程是一類特殊的線程,它和普通線程的區別在于它并不是應用程序的核心部分,當一個應用程序的所有非守護線程終止運行時,即使仍然有守護線程在運行,應用程序也將終止,反之,只要有一個非守護線程在運行,應用程序就不會終止。守護線程一般被用于在后臺為其它線程提供服務。


    可以通過調用方法 isDaemon() 來判斷一個線程是否是守護線程,也可以調用方法 setDaemon() 來將一個線程設為守護線程。



    八:線程組



    線程組是一個 Java 特有的概念,在 Java 中,線程組是類ThreadGroup 的對象,每個線程都隸屬于唯一一個線程組,這個線程組在線程創建時指定并在線程的整個生命期內都不能更改。你可以通過調用包含 ThreadGroup 類型參數的 Thread 類構造函數來指定線程屬的線程組,若沒有指定,則線程缺省地隸屬于名為 system 的系統線程組。


    在 Java 中,除了預建的系統線程組外,所有線程組都必須顯式創建。



    在 Java 中,除系統線程組外的每個線程組又隸屬于另一個線程組,你可以在創建線程組時指定其所隸屬的線程組,若沒有指定,則缺省地隸屬于系統線程組。這樣,所有線程組組成了一棵以系統線程組為根的樹。


    Java 允許我們對一個線程組中的所有線程同時進行操作,比如我們可以通過調用線程組的相應方法來設置其中所有線程的優先級,也可以啟動或阻塞其中的所有線程。



    Java 的線程組機制的另一個重要作用是線程安全。線程組機制允許我們通過分組來區分有不同安全特性的線程,對不同組的線程進行不同的處理,還可以通過線程組的分層結構來支持不對等安全措施的采用。Java 的 ThreadGroup 類提供了大量的方法來方便我們對線程組樹中的每一個線程組以及線程組中的每一個線程進行操作。



    九:總結



    在這一講中,我們一起學習了 Java 多線程編程的方方面面,包括創建線程,以及對多個線程進行調度、管理。我們深刻認識到了多線程編程的復雜性,以及線程切換開銷帶來的多線程程序的低效性,這也促使我們認真地思考一個問題:我們是否需要多線程?何時需要多線程?


    多線程的核心在于多個代碼塊并發執行,本質特點在于各代碼塊之間的代碼是亂序執行的。我們的程序是否需要多線程,就是要看這是否也是它的內在特點。



    假如我們的程序根本不要求多個代碼塊并發執行,那自然不需要使用多線程;假如我們的程序雖然要求多個代碼塊并發執行,但是卻不要求亂序,則我們完全可以用一個循環來簡單高效地實現,也不需要使用多線程;只有當它完全符合多線程的特點時,多線程機制對線程間通信和線程管理的強大支持才能有用武之地,這時使用多線程才是值得的。 

    posted @ 2009-03-31 01:15 AntiquMan 閱讀(186) | 評論 (0)編輯 收藏

    posted @ 2009-03-31 01:07 AntiquMan 閱讀(225) | 評論 (0)編輯 收藏

    癥狀:

    通過\\ip或\\<計算機名>訪問任何計算機時都會出現“找不到網絡路徑”的錯誤提示,無法正常訪問網絡資源,但可以訪問外部網頁。

    最終解決方法:

    運行netsh interface ip reset c:\log.txt命令重置tcp/ip各組件到初始狀態,重啟電腦后解決問題。

    問題解決步驟:

    1、檢查物理連接:因癥狀描述訪問外部網頁時沒問題,所以此步可略過。

    2、 Ping 127.0.0.1回環地址正常,說明tcp/ip協議的安裝(基本狀態)沒問題。

    3、 ping 對方計算機名和ip地址都正常(其中有用大數據包來ping),沒有丟包,說明計算機的基本連接(包括網卡本身和計算機之間的連接)和網絡名稱解析沒問題。物理層到網絡層都是沒問題的,應用層協議出現了問題。

    4、 檢查網絡設置:檢查在TCP/IP協議上是否捆綁了NETBIOS(在TCP/IP協議屬性—高級—WINS—選擇啟用TCP/IP上的NETBIOS);檢查是否已經安裝“Microsoft的文件和打印服務”組件,其它計算機也都必須啟用“文件和打印共享”,并檢查是否安裝了Microsoft網絡客戶端。此項檢查正常。

    5、 檢查是否啟動了“computer browser”的計算機瀏覽器服務,WIN2K/XP要確保計算機瀏覽服務正常啟動,保證其能參與網絡瀏覽選舉和主機宣告。打開計算機管理->服務和應用程序->服務,查看“Computer Browser”沒有被停止或禁用。此項檢查正常。

    6、 使用沒有帶域的網絡,windows xp的計算機必須啟用guest來賓賬號,因為未加入域的windows xp默認將來訪計算機的賬號等同于來賓賬號,經過檢查,其它被訪問計算機的guest賬號雖然是禁用的,但啟用后故障依舊。

    相關的策略設置說明:

    1)   依次選擇“計算機配置→Windows設置→安全設置→本地策略→安全選項 →網絡訪問:本地賬號的共享和安全模式”策略,將默認設置“僅來賓—本地用戶以來賓身份驗證”更改為“經典:本地用戶以自己的身份驗證”。此項策略可以讓訪問計算機的用戶通過網絡訪問使用Windows XP的計算機時,可以用自己的“身份”進行登錄。Windows xp的默認設置為僅來賓,而windows 2003和加入域的windows xp默認設置為經典。

    2)   在啟用“經典:本地用戶以自己的身份驗證”方式后,可以對同時訪問共享文件的用戶數量進行限制,并能針對不同用戶設置不同的訪問權限。但是用戶的口令為空時,訪問還是會被拒絕。這時需檢查“安全選項”→“賬戶:使用空白密碼的本地賬戶只允許進行控制臺登錄”策略是否被啟用,默認是啟用的,根據拒絕優先的原則,密碼為空的用戶通過網絡訪問使用Windows XP的計算機時便會被禁止。

    7、 檢查計算機是否允許來賓賬號訪問:逐一查看所有計算機的本地安全策略設置是否允許Guest(來賓)帳號從網絡上訪問本地計算機。在本地安全策略管理器gpedit.msc,依次選擇“計算機配置“→“Windows設置”→“本地策略”→“用戶權利指派”→““拒絕從網絡訪問這臺計算機”,查看策略里是否有包含有GUEST帳號,如果有則刪除。

    8、 確保被訪問機器的內置防火墻沒有打開:打開本地連接屬性->高級,關掉Internet連接防火墻。如果使用了第三方的防火墻,參考其相關的使用手冊,確保防火墻沒有禁用UDP-137、UDP-138、TCP-139和TCP-445。此項檢查后,所有計算機均未打開防火墻服務。

    9、 檢查RPC、Plug and Play服務是否已經啟動,重新注冊以下的動態鏈接庫:

    regsvr32 netshell.dll

    regsvr32 netcfgx.dll

    regsvr32 netman.dll

    經檢查RPC和Plug and play服務都均已啟動,并成功重新注冊了以上的動態鏈接庫。

    10、      最后的可能就是系統Tcp/ip組件損壞或缺失,在windows 98/2k的計算機可以直接卸載再重新安裝此協議,而在windows xp/2003,由于Tcp/ip是系統的核心組件,不能直接卸載,只能重置,復位Tcp/ip及相關的組件到干凈的狀態。在命令行窗口輸入netsh interface ip reset c:\log.txt(其中,log.txt是是指定命令生成的狀態日志文件名,可任意)。重新啟動后,故障解決。

    總結:

    經過這么多的查錯步驟,最后也就一條命令搞定,但是正確的排錯步驟必不可少。netsh還有其它一些重要功能,以下列舉幾個netsh命令的一些常用子功能及使用方法,其它更詳細用法請查看windows幫助和支持。

    1、 為網絡接口指定IP地址和網關

    下面的命令將配置名為 Local Area Connection 的接口,其靜態 IP 地址為 192.168.0.2,子網掩碼為 255.255.255.0,默認網關為 192.168.0.1:

    C:\>netsh interface ip

    Netsh interface ip>

    set address name="Local Area Connection" source=static addr=192.168.0.2 mask=255.255.255.0 gateway=192.168.0.1

    2、重置winsock目錄為空白狀態

    C:\>netsh winsock reset

    3、為網絡接口指定dns

    下面的命令將配置名為 Local Area Connection 的接口,其dns地址為192.168.0.3:

    C:\>netsh interface ip

    Netsh interface ip>set dns name=“Local Area Connection”source=static addr=192.168.0.3 ddns=enabled suffix=interface

    4、復位Tcp/ip及相關的組件到干凈的狀態

    C:\>netsh interface ip reset c:\log.txt

    復位Tcp/ip并將命令執行日志輸出到c:\log.txt。

    posted @ 2009-03-30 11:20 AntiquMan 閱讀(583) | 評論 (0)編輯 收藏

    1、表

    create table test (names varchar2(12),
    dates date,
    num int,
    dou double);

    2、視圖

    create or replace view vi_test as
    select * from test;

    3、同義詞

    create or replace synonym aa
    for dbusrcard001.aa;

    4、存儲過程

    create or replace produce dd(v_id in employee.empoy_id%type)
    as
    begin

    end
    dd;

    5、函數

    create or replace function ee(v_id in employee%rowtype) return varchar(15)
    is
    var_test varchar2(15);
    begin
    return var_test;
    exception when others then

    end

    6、三種觸發器的定義

    create or replace trigger ff
    alter delete
    on test
    for each row
    declare
    begin
    delete from test;
    if sql%rowcount %26lt; 0 or sql%rowcount is null then
    rais_replaction_err(-20004,"錯誤")
    end if
    end

    create or replace trigger gg
    alter insert
    on test
    for each row
    declare
    begin
    if :old.names = :new.names then
    raise_replaction_err(-2003,"編碼重復");
    end if
    end

    create or replace trigger hh
    for update
    on test
    for each row
    declare
    begin
    if updating then
    if :old.names %26lt;%26gt; :new.names then
    reaise_replaction_err(-2002,"關鍵字不能修改")
    end if
    end if
    end

    7、定義游標

    declare
    cursor aa is
    select names,num from test;
    begin
    for bb in aa
    loop
    if bb.names = "ORACLE" then

    end if
    end loop;

    end

    8、速度優化,前一語句不后一語句的速度快幾十倍

    select names,dates
    from test,b
    where test.names = b.names(+) and
    b.names is null and
    b.dates %26gt; date('2003-01-01','yyyy-mm-dd')

    select names,dates
    from test
    where names not in ( select names
    from b
    where dates %26gt; to_date('2003-01-01','yyyy-mm-dd'))

    9、查找重復記錄

    select names,num
    from test
    where rowid != (select max(rowid)
    from test b
    where b.names = test.names and
    b.num = test.num)

    10、查找表TEST中時間最新的前10條記錄

    select * from (select * from test order by dates desc) where rownum %26lt; 11

    11、序列號的產生

    create sequence row_id
    minvalue 1
    maxvalue 9999999999999999999999
    start with 1
    increment by 1

    insert into test values(row_id.nextval,....)

    posted @ 2009-03-30 10:24 AntiquMan 閱讀(155) | 評論 (0)編輯 收藏

    僅列出標題
    共4頁: 上一頁 1 2 3 4 
    主站蜘蛛池模板: 日本免费高清视频| 日韩免费一级毛片| 亚洲综合偷自成人网第页色| 日韩视频免费在线| 国产在线精品一区免费香蕉| 亚洲成AV人片久久| 亚洲人成电影在线播放| 99精品热线在线观看免费视频| 亚洲日本成本人观看| 亚洲中文字幕无码久久精品1 | 国产视频精品免费视频| 亚洲最大中文字幕| 亚洲精品专区在线观看| 4虎1515hh永久免费| 人妻18毛片a级毛片免费看| 亚洲高清在线mv| 亚洲男人av香蕉爽爽爽爽| 日韩精品免费一级视频| 一区二区三区免费视频网站| 亚洲伊人久久大香线蕉结合| 亚洲精品午夜无码专区| 国产在线观看免费完整版中文版 | 永久免费在线观看视频| 国产免费区在线观看十分钟| 亚洲影院天堂中文av色| 亚洲国产女人aaa毛片在线 | 亚洲国产黄在线观看| 成人无遮挡裸免费视频在线观看 | 国产成人综合亚洲一区| 亚洲毛片一级带毛片基地| 国产亚洲精品资在线| 国产精品免费视频播放器| 亚洲电影免费观看| 国产午夜精品免费一区二区三区| 国产AV无码专区亚洲AV蜜芽| 亚洲精品美女在线观看播放| 国产亚洲精品岁国产微拍精品| 免费很黄很色裸乳在线观看| 成人在线免费观看| 啦啦啦中文在线观看电视剧免费版| 国产免费爽爽视频在线观看|