posted @ 2021-12-15 09:09 AntiquMan 閱讀(80) | 評論 (0) | 編輯 收藏
posted @ 2021-12-15 09:08 AntiquMan 閱讀(56) | 評論 (0) | 編輯 收藏
posted @ 2021-12-15 09:07 AntiquMan 閱讀(152) | 評論 (0) | 編輯 收藏
posted @ 2021-12-15 09:07 AntiquMan 閱讀(74) | 評論 (0) | 編輯 收藏
posted @ 2021-12-15 09:06 AntiquMan 閱讀(114) | 評論 (0) | 編輯 收藏
卸載默認的:
用root用戶登陸到系統,打開一個終端輸入
# rpm -qa|grep gcj
顯示內容其中包含下面兩行信息
# java-1.4.2-gcj-compat-1.4.2.0-27jpp
# java-1.4.2-gcj-compat-devel-l.4.2.0-27jpp
卸載
# rpm -e java-1.4.2-gcj-compat-devel-l.4.2.0-27jpp
# rpm -e java-1.4.2-gcj-compat-l.4.2.0-27jpp
卸載其他自己安裝的JDK就直接用rpm -e <javaXXXXX>
卸載rpm版的jdk:
#rpm -qa|grep jdk
顯示:jdk-1.6.0_10-fcs
卸載:#rpm -e --nodeps jdk-1.6.0_10-fcs
posted @ 2015-09-29 22:26 AntiquMan 閱讀(160) | 評論 (0) | 編輯 收藏
1. 安裝前,最好先刪除Linux自帶的OpenJDK:
(1)運行java-version,會發現Linux自帶的OpenJDK,運行rpm -qa | grep OpenJDK,找出自帶的OpenJDK名稱;
(2)運行rpm - nodeps -e OpenJDK名稱,刪除OpenJDK;
2. 下載jdk-8u20-linux-x64.rpm,運行rpm -ivh jdk-8u20-linux-x64.rpm安裝;
3. 運行vim /etc/profile,在文件末尾輸入以下幾行:
export JAVA_HOME=/usr/java/jdk1.8.0_20
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
保存,退出;
4. 運行source /etc/profile,使/etc/profile文件生效,或者重啟;
5. 運行java -version,返回結果如下:
java version "1.8.0_20"
Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode)
說明JDK1.8已經安裝成功!
---------------------Jrockit JDK 16
posted @ 2015-09-29 21:25 AntiquMan 閱讀(593) | 評論 (0) | 編輯 收藏
前段時間ORACLE把10G的下載從官網拿掉了 ,許多童鞋不知道ORACLE 10g 的下載地址,這里我附上oracle 10g 下載的鏈接,方便大家下載。
點擊鏈接使用迅雷即可下載。
4種包的介紹:
***_database_*.zip 是oracle數據庫 服務端 軟件的安裝包,如果你要創建一個數據庫,請下載這個版本
***_client_*.zip 是oracle數據庫 客戶端 軟件的安裝包,如果你不需要創建數據庫,只是用來操作遠程電腦上的數據庫時,請下載這個版本
***_gateways_*.zip oracle透明網關,如果你要鏈接其他數據庫,請下載這個軟件包
***_clusterware_*.zip oracle集群軟件,如果你要做RAC,請下載這個軟件包
Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Linux x86
http://download.oracle.com/otn/linux/oracle10g/10201/10201_database_linux32.zip
http://download.oracle.com/otn/linux/oracle10g/10201/10201_client_linux32.ziphttp://download.oracle.com/otn/linux/oracle10g/10201/10201_clusterware_linux32.zip
http://download.oracle.com/otn/linux/oracle10g/10201/10201_gateways_linux32.zip
Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Linux x86-64
http://download.oracle.com/otn/linux/oracle10g/10201/10201_database_linux_x86_64.cpio.gz
http://download.oracle.com/otn/linux/oracle10g/10201/10201_client_linux_x86_64.cpio.gz
http://download.oracle.com/otn/linux/oracle10g/10201/10201_clusterware_linux_x86_64.cpio.gz
http://download.oracle.com/otn/linux/oracle10g/10201/10201_gateways_linux_x86_64.cpio.gz
Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Microsoft Windows (32-bit)
http://download.oracle.com/otn/nt/oracle10g/10201/10201_database_win32.zip
http://download.oracle.com/otn/nt/oracle10g/10201/10201_client_win32.zip
http://download.oracle.com/otn/nt/oracle10g/10201/10201_clusterware_win32.zip
http://download.oracle.com/otn/nt/oracle10g/10201/10201_gateways_win32.zip
Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Microsoft Windows (x64)
http://download.oracle.com/otn/nt/oracle10g/10201/102010_win64_x64_database.zip
http://download.oracle.com/otn/nt/oracle10g/10201/102010_win64_x64_client.zip
http://download.oracle.com/otn/nt/oracle10g/10201/102010_win64_x64_clusterware.zip
如果是win7 64位,可能下載上面的版本還是無法安裝,需要下載下面的這個版本:
http://download.oracle.com/otn/nt/oracle10g/10204/10204_vista_w2k8_x64_production_db.zip
Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for AIX5L
http://download.oracle.com/otn/aix/oracle10g/10201/10gr2_aix5l64_database.cpio.gz
http://download.oracle.com/otn/aix/oracle10g/10201/10gr2_aix5l64_client.cpio.gz
http://download.oracle.com/otn/aix/oracle10g/10201/10gr2_aix5l64_cluster.cpio.gz
http://download.oracle.com/otn/aix/oracle10g/10201/10gr2_aix5l64_gateways.cpio.gz
Oracle Database 10g Release 2 (10.2.0.2) Enterprise/Standard Edition for Solaris Operating System (x86)
http://download.oracle.com/otn/solaris/oracle10g/10202/10202_database_solx86.zip
http://download.oracle.com/otn/solaris/oracle10g/10202/10202_client_solx86.zip
http://download.oracle.com/otn/solaris/oracle10g/10202/10202_clusterware_solx86.zip
Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Solaris Operating System (x86-64)
http://download.oracle.com/otn/solaris/oracle10g/10201/x8664/10201_database_solx86_64.zip
http://download.oracle.com/otn/solaris/oracle10g/10201/x8664/10201_client_solx86_64.zip
http://download.oracle.com/otn/solaris/oracle10g/10201/x8664/10201_clusterware_solx86_64.zip
posted @ 2015-08-20 19:27 AntiquMan 閱讀(165) | 評論 (0) | 編輯 收藏
如果忽略該錯誤啟動DFS,會發現datanode無法正常啟動。
原因:
hadoop在格局化HDFS的時辰,經由過程hostname號令獲取到的主機名在/etc/hosts文件中進行映射的時辰,沒有找到,也就是名字不一樣。
即:
配置文件slaves 填寫的 主機名 要與 節點的主機名一致(節點機上hostname查看)
查看本身用戶的主機名:hostname
查看/etc/hosts內容:cat /etc/hosts
hosts文件 里面我們自己隨意起的主機名字是不可以的,必須與 節點主機hostname一致。
結論:
節點主機: hostname 、 個主機中的/etc/hosts 下的hostname 、 配置文件slaves 中的hostname 必須完全一致。
解決方法
修改/etc/sysconfig/network中HOSTNAME的值為localhost,或者自己指定的主機名,保證localhost在/etc/hosts文件中映射為正確的IP地址,然后重新啟動網絡服務.
/etc/rc.d/init.d/network restartposted @ 2015-08-19 14:24 AntiquMan 閱讀(795) | 評論 (0) | 編輯 收藏
什么是域名解析:域名解析就是域名到IP地址的轉換過程。IP地址是網路上標識您站點的數字地址,為了簡單好記,采用域名來代替IP地址標識站點地址。域名的解析工作由DNS服務器完成。
什么是A記錄(IP指向): 用來指定域名對應的IP地址記錄。用戶可以將該域名解析到自己的web server上。同時也可以設置您域名的二級域名。
什么是cname記錄(別名指向):相當于用子域名來代替ip地址,優點是如果ip地址變化,只需要改動子域名的解析,而不需要逐一改變ip地址解析。
什么是URL(轉發):訪問您的域名時,將會自動跳轉到您所指定的另一個網絡地址(URL),此時在瀏覽器地址欄顯示的是你跳轉的地址。
什么是frame(隱藏轉發):訪問您的域名時,將會自動跳轉到您所指定的另一個網絡地址(URL),此時在瀏覽器地址欄顯示的是你原域名地址。
什么是mail記錄:它指向一個郵件服務器,用于電子郵件系統發郵件時根據 收信人的地址后綴來定位郵件服務器。
什么是MX記錄:它指向一個郵件服務器,用于電子郵件系統發郵件時根據 收信人的地址后綴來定位郵件服務器。
posted @ 2015-08-10 14:37 AntiquMan 閱讀(297) | 評論 (0) | 編輯 收藏
第二步:在CLASSPATH下建立log4j.properties。內容如下:
1 log4j.rootCategory=INFO, stdout , R
2
3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
5 log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n
6
7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
8 log4j.appender.R.File=D:\Tomcat 5.5\logs\qc.log
9 log4j.appender.R.layout=org.apache.log4j.PatternLayout
10 log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n
11
12 log4j.logger.com.neusoft=DEBUG
13 log4j.logger.com.opensymphony.oscache=ERROR
14 log4j.logger.net.sf.navigator=ERROR
15 log4j.logger.org.apache.commons=ERROR
16 log4j.logger.org.apache.struts=WARN
17 log4j.logger.org.displaytag=ERROR
18 log4j.logger.org.springframework=DEBUG
19 log4j.logger.com.ibatis.db=WARN
20 log4j.logger.org.apache.velocity=FATAL
21
22 log4j.logger.com.canoo.webtest=WARN
23
24 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN
25 log4j.logger.org.hibernate=DEBUG
26 log4j.logger.org.logicalcobwebs=WARN
第三步:相應的修改其中屬性,修改之前就必須知道這些都是干什么的,在第二部分講解。
第四步:在要輸出日志的類中加入相關語句:
定義屬性:protected final Log log = LogFactory.getLog(getClass());
在相應的方法中:
if (log.isDebugEnabled())
{
log.debug(“System …..”);
}
二、Log4j說明
1 log4j.rootCategory=INFO, stdout , R
此句為將等級為INFO的日志信息輸出到stdout和R這兩個目的地,stdout和R的定義在下面的代碼,可以任意起名。等級可分為OFF、 FATAL、ERROR、WARN、INFO、DEBUG、ALL,如果配置OFF則不打出任何信息,如果配置為INFO這樣只顯示INFO, WARN, ERROR的log信息,而DEBUG信息不會被顯示,具體講解可參照第三部分定義配置文件中的logger。
3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
此句為定義名為stdout的輸出端是哪種類型,可以是
org.apache.log4j.ConsoleAppender(控制臺),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件),
org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件)
org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)
具體講解可參照第三部分定義配置文件中的Appender。
4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
此句為定義名為stdout的輸出端的layout是哪種類型,可以是
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串),
org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息)
具體講解可參照第三部分定義配置文件中的Layout。
5 log4j.appender.stdout.layout.ConversionPattern= [QC] %p [%t] %C.%M(%L) | %m%n
如果使用pattern布局就要指定的打印信息的具體格式ConversionPattern,打印參數如下:
%m 輸出代碼中指定的消息
%p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL
%r 輸出自應用啟動到輸出該log信息耗費的毫秒數
%c 輸出所屬的類目,通常就是所在類的全名
%t 輸出產生該日志事件的線程名
%n 輸出一個回車換行符,Windows平臺為“rn”,Unix平臺為“n”
%d 輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
%l 輸出日志事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。
[QC]是log信息的開頭,可以為任意字符,一般為項目簡稱。
輸出的信息
[TS] DEBUG [main] AbstractBeanFactory.getBean(189) | Returning cached instance of singleton bean 'MyAutoProxy'
具體講解可參照第三部分定義配置文件中的格式化日志信息。
7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
此句與第3行一樣。定義名為R的輸出端的類型為每天產生一個日志文件。
8 log4j.appender.R.File=D:\Tomcat 5.5\logs\qc.log
此句為定義名為R的輸出端的文件名為D:\Tomcat 5.5\logs\qc.log
可以自行修改。
9 log4j.appender.R.layout=org.apache.log4j.PatternLayout
與第4行相同。
10 log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n
與第5行相同。
12 log4j.logger.com. neusoft =DEBUG
指定com.neusoft包下的所有類的等級為DEBUG。
可以把com.neusoft改為自己項目所用的包名。
13 log4j.logger.com.opensymphony.oscache=ERROR
14 log4j.logger.net.sf.navigator=ERROR
這兩句是把這兩個包下出現的錯誤的等級設為ERROR,如果項目中沒有配置EHCache,則不需要這兩句。
15 log4j.logger.org.apache.commons=ERROR
16 log4j.logger.org.apache.struts=WARN
這兩句是struts的包。
17 log4j.logger.org.displaytag=ERROR
這句是displaytag的包。(QC問題列表頁面所用)
18 log4j.logger.org.springframework=DEBUG
此句為Spring的包。
24 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN
25 log4j.logger.org.hibernate=DEBUG
此兩句是hibernate的包。
以上這些包的設置可根據項目的實際情況而自行定制。
三、log4j詳解
1、定義配置文件
Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是Java特性文件log4j.properties(鍵=值)。下面將介紹使用log4j.properties文件作為配置文件的方法:
①、配置根Logger
Logger 負責處理日志記錄的大部分操作。
其語法為:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中,level 是日志記錄的優先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定義的級別。Log4j建議只使用四個級別,優 先級從高到低分別是ERROR、WARN、INFO、DEBUG。通過在這里定義的級別,您可以控制到應用程序中相應級別的日志信息的開關。比如在這里定 義了INFO級別,只有等于及高于這個級別的才進行處理,則應用程序中所有DEBUG級別的日志信息將不被打印出來。ALL:打印所有的日志,OFF:關 閉所有的日志輸出。 appenderName就是指定日志信息輸出到哪個地方。可同時指定多個輸出目的地。
②、配置日志信息輸出目的地 Appender
Appender 負責控制日志記錄操作的輸出。
其語法為:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.optionN = valueN
這里的appenderName為在①里定義的,可任意起名。
其中,Log4j提供的appender有以下幾種:
org.apache.log4j.ConsoleAppender(控制臺),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天產生一個日志文件),
org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件),可通過 log4j.appender.R.MaxFileSize=100KB設置文件大小,還可通過 log4j.appender.R.MaxBackupIndex=1設置為保存一個備份文件。
org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)
例如:log4j.appender.stdout=org.apache.log4j.ConsoleAppender
定義一個名為stdout的輸出目的地,ConsoleAppender為控制臺。
③、配置日志信息的格式(布局)Layout
Layout 負責格式化Appender的輸出。
其語法為:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.optionN = valueN
其中,Log4j提供的layout有以下幾種:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串),
org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息)
2、格式化日志信息
Log4J采用類似C語言中的printf函數的打印格式格式化日志信息,打印參數如下:
%m 輸出代碼中指定的消息
%p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL
%r 輸出自應用啟動到輸出該log信息耗費的毫秒數
%c 輸出所屬的類目,通常就是所在類的全名
%t 輸出產生該日志事件的線程名
%n 輸出一個回車換行符,Windows平臺為“rn”,Unix平臺為“n”
%d 輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
%l 輸出日志事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。
3、在代碼中使用Log4j
我們在需要輸出日志信息的類中做如下的三個工作:
1、導入所有需的commongs-logging類:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
2、在自己的類中定義一個org.apache.commons.logging.Log類的私有靜態類成員:
private final Log log = LogFactory.getLog(getClass());
LogFactory.getLog()方法的參數使用的是當前類的class。
3、使用org.apache.commons.logging.Log類的成員方法輸出日志信息:
if (log.isDebugEnabled())
{
log.debug("111");
}
if (log.isInfoEnabled())
{
log.info("222");
}
if (log.isWarnEnabled())
{
log.warn("333");
}
if (log.isErrorEnabled())
{
log.error("444");
}
if (log.isFatalEnabled())
{
log.fatal("555")
}
轉載:http://m.tkk7.com/kit-soft/archive/2009/08/28/292977.html
posted @ 2013-08-26 11:27 AntiquMan 閱讀(227) | 評論 (0) | 編輯 收藏
用一個存儲過程創建并執行JOB,代碼如下:
- CREATE OR REPLACE PROCEDURE P_TEST_JOB
- IS
- --判斷任務是否已被創建,若任務被創建過,則 isExist > 0
- isExist NUMBER := 0;
- --歸檔任務標識
- jobId NUMBER;
- BEGIN
- SELECT COUNT(*) INTO isExist FROM ALL_JOBS J WHERE J.WHAT = '過程名;';
- --檢查任務是否已被創建,如果已被創建,則不做操作
- IF isExist = 0 THEN
- --創建任務
- DBMS_JOB.submit(jobId, --任務標識
- '過程名;', --任務要執行的存儲過程,后邊的分號不可略
- SYSDATE, --任務開始時間
- 'SYSDATE + 10/1440'); --任務執行周期,此處指每10分鐘執行一次
- COMMIT;
- --運行任務
- DBMS_JOB.run(jobId);
- COMMIT;
- END IF;
- END;
執行此存儲過程,在ORACLE運行的JOB列表里會出現新增的JOB,可以用
- SELECT * FROM ALL_JOBS J WHERE J.WHAT = '過程名;'
posted @ 2011-09-12 15:04 AntiquMan 閱讀(291) | 評論 (0) | 編輯 收藏
Windows 7硬盤安裝方法大全:包括Windows 7下安裝高版本的Windows 7,Vista下硬盤安裝Windows 7,xp下硬盤安裝Windows7等方法!
Windows 7 RTM 7600 16385 簡體中文旗艦版32位下載地址,請將下面的鏈接復制下來,然后在迅雷里面“新建”下載任務,把地址粘貼進去,速度在1M左右。
ftp://124.115.177.55/共享文件夾/裝機工具/7600.16385.090713-1255_x86fre_client_zh-cn_Retail_Ultimate-GRMCULFRER_CN_DVD.iso
首先,向您推薦一種最方便的安裝方法(我就是用這種方法安裝自己的Win7)。使用nt6 hdd installer這個小工具。下載地址:http://www.xdowns.com/soft/6/boot/2009/Soft_57197.html
原系統(2000/XP/2003/VISTA/2008/WIN7/PE)和要新裝的WIN7系統都沒有32位/64位限制;裝成單系統還是多系統也沒有限制;安裝過程免命令提示符操作
一、虛擬光驅加載后復制或UltraISO/WINRAR解壓ISO文件至硬盤一非系統分區的根目錄
(也可以依照附件中的圖示操作)
注意:是復制或解壓至根目錄,而不是某文件夾,這一點和傳統硬盤安裝方法不同
二、下載并安裝 nt6 hdd Installer
下載地址:http://www.xdowns.com/soft/6/boot/2009/Soft_57197.html
三、重啟選擇nt6 hdd installer后自動進入安裝界面,安裝操作和光盤一樣,裝在其它分區上成雙系統、格式化C盤結果為單系統就隨你所需了。
點擊下面的圖片可以在新窗口中查看大圖。
一、windows 7系統下全新安裝高版Windows7 (注意:Home Basic等幾個低版本的Win7或Vista開機按F8會沒有“修復系統”這一個菜單選項,那么這種方法就不適用了):
1、下載windows7
2、開機按F8——修復系統——選擇最后一項命令修復——在命令框輸入"D:\7600\sources\setup.exe"(不帶引號)
3、進入安裝界面、選擇custom (自定義)安裝
4、選擇安裝語言、格式化C盤
5、OK了,裝好后是一個純系統(非雙系統)。
二、如果有vista安裝盤的話,方法也很簡單:
1、下載windows7
2、BIOS中選擇光驅啟動,進入vista安裝界面
3、選擇左下角修復計算機(自動搜索系統,提示加載驅動或關閉,選擇關閉進入修復選項)
4、選擇最后一項命令修復,在命令框輸入"D:\7600\sources\setup.exe"(不帶引號),開始安裝
5、選擇安裝語言、格式化C盤 (即使C盤原本沒有系統此法也可行)
三、XP系統下全新安裝windows 7:
1、下載windows 7 7600 ISO鏡像(RTM),用虛擬光驅拷貝至非C盤(如D:\7600)
2、把D:\7600目錄下的bootmgr和boot目錄(其實只要里面的boot.sdi和bcd文件)拷貝到c盤根目錄下,并在C盤根目錄下建個sources文件夾。(XP下不需要取得管理員權限)
3、把D:\7600\sources下的boot.win復制到C盤剛建的sources文件夾
4、用管理員身份運行cmd,然后輸入c:\boot\bootsect.exe /nt60 c: 提示successful(即成功了!)
5、關閉cmd窗口重啟計算機,自動進入安裝界面,選擇安裝語言,同時選擇適合自己的時間和貨幣顯示種類及鍵盤和輸入方式
6、出現"開始安裝界面",(要注意了,不點擊"現在安裝")點左下角"修復計算機"(repair mycomputer),進入"系統恢復選擇",選擇最后一項"命令提示符"(commandprompt),進入DOS窗口
7、輸入"D:\7600\sources\setup.exe"(不帶引號),開始安裝
8、選擇安裝語言、格式化C盤,就OK了
四、vista系統下全新安裝windows7:
1、下載windows 7 7600ISO鏡像(RTM),用虛擬光驅拷貝至非C盤(如D:\7600)
2、復制D:\7600文件夾中的Boot、EFI、sources文件夾和bootmgr至C盤根目錄下
3、復制D:\7600\boot下Bootsect.exe至C盤根目錄下
第2部需取得管理員權限
4、管理員身份運行cmd,輸入c:\bootsect.exe/nt60 c:并回車(最好復制,中間有空格)
5、重啟系統自動進入安裝界面,點左下角的修復計算機repair my computer)
6、選擇最后一項命令提示符,進入DOS窗口,輸入D:\7600\sources\setup.exe進入安裝界面
7、選擇安裝語言、格式化C盤,就OK了
posted @ 2011-07-29 16:20 AntiquMan 閱讀(377) | 評論 (0) | 編輯 收藏
剛裝WINDOWS 7 啟動tomcat 時 報Unrecognized Windows Sockets error: 0: JVM_Bind
當時,我就覺的怪了,我以前系統重裝后,根本就沒有出現這樣的事情啊,最我想一下,一定是tomcat的
配置文件端口有問題.最后我終于發現在了 在tomcat 下的conf文件下的server.xml 把
<Server port="8009" shutdown="SHUTDOWN">
<Connector port="8090" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8099" protocol="AJP/1.3" redirectPort="8443" />
這三個端口改掉就OK了
posted @ 2010-12-04 11:56 AntiquMan 閱讀(1024) | 評論 (0) | 編輯 收藏
用上了Windows 7之后,感覺速度快了很多。可有點不爽的是:不少軟件特別是綠色軟件在運行時,總會彈出“用戶賬戶控制”(UAC)提示,單擊“是”才能正常運行。雖然關閉UAC可以實現不彈出對話框,但是會讓系統不安全,如果能在保持開啟UAC的同時讓信任的軟件啟動時不再彈出UAC選擇就好了,現在使用一款微軟推出的軟件即可解決問題。(下載地址:http://www.cbifamily.com/download/200941.html)
第1分鐘:安裝軟件
下載安裝Microsoft Application Compatibility Toolkit 5.5之后,右擊“Microsoft Application Compatibility Toolkit 5.5”程序組中的“Compatibility Administrator”,選擇“以管理員身份運行”,單擊“是”打開該工具。
●以管理員身份運行
第2分鐘:創建新的數據庫
單擊工具欄上的“New”按鈕,然后右擊“Custom Databases”下的“New Database(1)”出現菜單,選擇“Create New”下的“Application Fix…”出現對話框。
●建立新的數據庫
第3分鐘:設置信任的軟件進程
在“Name of the programto be fixed”和“Name of the vendor for this program”中輸入要加入白名單的軟件名稱,可任意輸入;單擊“Browse…”按鈕選擇程序的執行文件,一般是exe文件。右擊程序的執行文件選擇“屬性”,在“目標”中可以找到程序執行文件的路徑。
第4分鐘:設置軟件權限
單擊“下一步”切換窗口,選擇“Operating system modes”下的“None”,選擇“Select additional compatibility modes”下的“RunAsAdmin”和“RunAslnvoker”兩個選項,連續單擊兩次“下一步”,最后單擊“完成”按鈕返回主界面。
●設置軟件運行的權限
第5分鐘:設置完成
單擊工具欄上的“Save”按鈕,在“Datebase Name”中任意輸入一個文件名,單擊OK后再次輸入任何文件名保存創建的白名單,最后選擇菜單“File”下的“Install”將白名單添加到Windows 7的UAC中,此時會出現對話框提示安裝成功,再點擊一下run選項運行一下設置的軟件,然后關閉這個軟件,就會實現自己信任的軟件打開不彈出UAC對話框的效果了。
●設置完成之后別忘點擊RUN先測試一下
posted @ 2010-11-30 09:21 AntiquMan 閱讀(1767) | 評論 (0) | 編輯 收藏
我使用兩種精簡的Oracle客戶端,大家可以任選其一:一、Oracle 9i (版本: 9.0.1.0.1)精簡客戶端 綠色版
占用35M空間, 帶SqlPlus工具。綠色版,超級推薦!!!使用方法:
1. 確定OracleHome目錄:比如我準備把Oracle 客戶端放在 d:\program files\Oracle 下
2. 把ora90目錄復制到d:\program files\Oracle 目錄下
3. 如果你的OracleHome目錄與我的不同,請用計事本打開install_oracle9i.reg 文件,替換d:\\progra~1\\Oracle,保存。
4. 雙擊install_oracle9i.reg, 導入注冊表。
5. 用計事本打開D:\Program Files\Oracle\ora90\network\ADMIN\tnsnames.ora 文件,增加一個自己的數據庫別名配置,保存。 可以復制其中的一個,然后進行修改,主要改=前面的別名,Host為IP地址, SERVICE_NAME為數據庫服務器的實例名。
6. 然后運行D:\Program Files\Oracle\ora90\BIN\sqlplusw.exe,輸入用戶名/密碼@別名,即可。卸載方法:
1. 雙擊uninstall_oracle9i.reg, 導入注冊表。
2. 刪除d:\program files\Oracle 目錄。
下載地址:二、Oracle 10g Instant ClientOracle Instant Client 是Oracle 公司推出的精簡版客戶端,不需要安裝,但需要簡單配置一下。下載地址: [url]http://www.oracle.com/technology/software/tech/oci/instantclient/index.html[/url]
我下載的是Win32平臺下的10.2.0.3 Basic版本。Instant client 有2個版本:Basic和Basic Lite。
Basic版本包括了所有的支持運行OCI、OCCI、JDBC、JDBC-OCI的文件,支持多種語言。
Basic Lite是Basic版本的精簡版,只包括了英文的錯誤描述,也只支持Unicode、ASCII和歐洲字符集。
因此,如果數據庫服務器是中文字符集(如 SIMPLIFIED CHINESE_CHINA.ZHS16GBK),則必須下載Basic版本。
Basic Lite 占用25M空間,Basic 占用93M空間。要支持中文,就一下子多了70M,汗!
另外,可以下載sqlplus,不過是命令行的版本,不是圖形界面的。1. 把下載的Basic版壓縮包解壓,放到 D:\Program Files\instantclient_10_2 目錄下,總共8個文件。
2. 桌面上,右鍵點“我的電腦”,選擇“屬性”,選擇“高級”頁中的“環境變量”,在系統變量中,增加:
1) 變量名:ORACLE_HOME
變量值:D:\Program Files\instantclient_10_2
2) 變量名:TNS_ADMIN
變量值:D:\Program Files\instantclient_10_2
3) 變量名:NLS_LANG
變量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
4) 修改Path變量,在后面添加 D:\Program Files\instantclient_10_2
如果不愿意手工增加,可以下載 SetOraEnv.rar 附件, 解壓后執行其中的 setOraEnv.bat.
3. 在D:\Progra~1\instantclient_10_2 新建一個文本文件,文件名為tnsnames.ora,文件中增加自己的數據庫別名配置,
示例如下:
MyDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.1.16)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ora10g)
)
)主要改=前面的別名,Host為IP地址, SERVICE_NAME為數據庫服務器的實例名。
4. 把sqlplus的壓縮包中的文件,解壓到 D:\Program Files\instantclient_10_2 目錄下,共3個文件。
在Dos命令行,在D:\Program Files\instantclient_10_2 目錄下,運行 sqlplususername/password@dbname,即可連到數據庫上。
卸載方法:
1. 桌面上,右鍵點“我的電腦”,選擇“屬性”,選擇“高級”頁中的“環境變量”,在系統變量中,
刪除 ORACLE_HOME, TNS_ADMIN, NLS_LANG 三個變量,修改path變量,去掉D:\Program Files\instantclient_10_2目錄。
2. 刪除D:\Progra~1\instantclient_10_2 目錄.
三、第三方工具使用:
上面的任何一種客戶端配置好后,都可以安裝Toad 或者PL/SQL Developer 工具,不需要再額外進行任何設置,即可使用。
本文出自 “expert” 博客,請務必保留此出處http://expert.blog.51cto.com/339473/70969
posted @ 2010-11-29 20:07 AntiquMan 閱讀(1306) | 評論 (0) | 編輯 收藏
posted @ 2010-02-26 15:39 AntiquMan 閱讀(156) | 評論 (0) | 編輯 收藏
posted @ 2009-10-13 09:21 AntiquMan 閱讀(177) | 評論 (0) | 編輯 收藏
我試圖在文件夾選項可注冊表中重新設置打開方式,結果還是不行。。
到網上搜索一下相關的方法呢。
果然搜索到了,使用以下命令就可以恢復XML文件的默認關聯:
REGSVR32 MSXML3.DLL
運行之后,XML的打開方式就恢復默認了。
posted @ 2009-09-08 23:48 AntiquMan 閱讀(854) | 評論 (0) | 編輯 收藏
posted @ 2009-09-08 11:31 AntiquMan 閱讀(2021) | 評論 (0) | 編輯 收藏
你覺得自己是一個Java專家嗎?是否肯定自己已經全面掌握了Java的異常處理機制?在下面這段代碼中,你能夠迅速找出異常處理的六個問題嗎?
1 OutputStreamWriter out = ... 2 java.sql.Connection conn = ... 3 try { // ⑸ 4 Statement stat = conn.createStatement(); 5 ResultSet rs = stat.executeQuery( 6 "select uid, name from user"); 7 while (rs.next()) 8 { 9 out.println("ID:" + rs.getString("uid") // ⑹ 10 ",姓名:" + rs.getString("name")); 11 } 12 conn.close(); // ⑶ 13 out.close(); 14 } 15 catch(Exception ex) // ⑵ 16 { 17 ex.printStackTrace(); //⑴,⑷ 18 } |
作為一個Java程序員,你至少應該能夠找出兩個問題。但是,如果你不能找出全部六個問題,請繼續閱讀本文。
本文討論的不是Java異常處理的一般性原則,因為這些原則已經被大多數人熟知。我們要做的是分析各種可稱為“反例”(anti-pattern)的違背優秀編碼規范的常見壞習慣,幫助讀者熟悉這些典型的反面例子,從而能夠在實際工作中敏銳地察覺和避免這些問題。
反例之一:丟棄異常
代碼:15行-18行。
這段代碼捕獲了異常卻不作任何處理,可以算得上Java編程中的殺手。從問題出現的頻繁程度和禍害程度來看,它也許可以和C/C++程序的一個惡名遠播的問題相提并論??不檢查緩沖區是否已滿。如果你看到了這種丟棄(而不是拋出)異常的情況,可以百分之九十九地肯定代碼存在問題(在極少數情況下,這段代碼有存在的理由,但最好加上完整的注釋,以免引起別人誤解)。
這段代碼的錯誤在于,異常(幾乎)總是意味著某些事情不對勁了,或者說至少發生了某些不尋常的事情,我們不應該對程序發出的求救信號保持沉默和無動于衷。調用一下printStackTrace算不上“處理異常”。不錯,調用printStackTrace對調試程序有幫助,但程序調試階段結束之后,printStackTrace就不應再在異常處理模塊中擔負主要責任了。
丟棄異常的情形非常普遍。打開JDK的ThreadDeath類的文檔,可以看到下面這段說明:“特別地,雖然出現ThreadDeath是一種‘正常的情形’,但ThreadDeath類是Error而不是Exception的子類,因為許多應用會捕獲所有的Exception然后丟棄它不再理睬。”這段話的意思是,雖然ThreadDeath代表的是一種普通的問題,但鑒于許多應用會試圖捕獲所有異常然后不予以適當的處理,所以JDK把ThreadDeath定義成了Error的子類,因為Error類代表的是一般的應用不應該去捕獲的嚴重問題。可見,丟棄異常這一壞習慣是如此常見,它甚至已經影響到了Java本身的設計。
那么,應該怎樣改正呢?主要有四個選擇:
1、處理異常。針對該異常采取一些行動,例如修正問題、提醒某個人或進行其他一些處理,要根據具體的情形確定應該采取的動作。再次說明,調用printStackTrace算不上已經“處理好了異常”。
2、重新拋出異常。處理異常的代碼在分析異常之后,認為自己不能處理它,重新拋出異常也不失為一種選擇。
3、把該異常轉換成另一種異常。大多數情況下,這是指把一個低級的異常轉換成應用級的異常(其含義更容易被用戶了解的異常)。
4、不要捕獲異常。
結論一:既然捕獲了異常,就要對它進行適當的處理。不要捕獲異常之后又把它丟棄,不予理睬。
反例之二:不指定具體的異常
代碼:15行。
許多時候人們會被這樣一種“美妙的”想法吸引:用一個catch語句捕獲所有的異常。最常見的情形就是使用catch(Exception ex)語句。但實際上,在絕大多數情況下,這種做法不值得提倡。為什么呢?
要理解其原因,我們必須回顧一下catch語句的用途。catch語句表示我們預期會出現某種異常,而且希望能夠處理該異常。異常類的作用就是告訴Java編譯器我們想要處理的是哪一種異常。由于絕大多數異常都直接或間接從java.lang.Exception派生,catch(Exception ex)就相當于說我們想要處理幾乎所有的異常。
再來看看前面的代碼例子。我們真正想要捕獲的異常是什么呢?最明顯的一個是SQLException,這是JDBC操作中常見的異常。另一個可能的異常是IOException,因為它要操作OutputStreamWriter。顯然,在同一個catch塊中處理這兩種截然不同的異常是不合適的。如果用兩個catch塊分別捕獲SQLException和IOException就要好多了。這就是說,catch語句應當盡量指定具體的異常類型,而不應該指定涵蓋范圍太廣的Exception類。
另一方面,除了這兩個特定的異常,還有其他許多異常也可能出現。例如,如果由于某種原因,executeQuery返回了null,該怎么辦?答案是讓它們繼續拋出,即不必捕獲也不必處理。實際上,我們不能也不應該去捕獲可能出現的所有異常,程序的其他地方還有捕獲異常的機會??直至最后由JVM處理。
結論二:在catch語句中盡可能指定具體的異常類型,必要時使用多個catch。不要試圖處理所有可能出現的異常。
反例之三:占用資源不釋放
代碼:3行-14行。
異常改變了程序正常的執行流程。這個道理雖然簡單,卻常常被人們忽視。如果程序用到了文件、Socket、JDBC連接之類的資源,即使遇到了異常,也要正確釋放占用的資源。為此,Java提供了一個簡化這類操作的關鍵詞finally。
finally是樣好東西:不管是否出現了異常,Finally保證在try/catch/finally塊結束之前,執行清理任務的代碼總是有機會執行。遺憾的是有些人卻不習慣使用finally。
當然,編寫finally塊應當多加小心,特別是要注意在finally塊之內拋出的異常??這是執行清理任務的最后機會,盡量不要再有難以處理的錯誤。
結論三:保證所有資源都被正確釋放。充分運用finally關鍵詞。
反例之四:不說明異常的詳細信息
代碼:3行-18行。
仔細觀察這段代碼:如果循環內部出現了異常,會發生什么事情?我們可以得到足夠的信息判斷循環內部出錯的原因嗎?不能。我們只能知道當前正在處理的類發生了某種錯誤,但卻不能獲得任何信息判斷導致當前錯誤的原因。
printStackTrace的堆棧跟蹤功能顯示出程序運行到當前類的執行流程,但只提供了一些最基本的信息,未能說明實際導致錯誤的原因,同時也不易解讀。
因此,在出現異常時,最好能夠提供一些文字信息,例如當前正在執行的類、方法和其他狀態信息,包括以一種更適合閱讀的方式整理和組織printStackTrace提供的信息。
結論四:在異常處理模塊中提供適量的錯誤原因信息,組織錯誤信息使其易于理解和閱讀。
反例之五:過于龐大的try塊
代碼:3行-14行。
經常可以看到有人把大量的代碼放入單個try塊,實際上這不是好習慣。這種現象之所以常見,原因就在于有些人圖省事,不愿花時間分析一大塊代碼中哪幾行代碼會拋出異常、異常的具體類型是什么。把大量的語句裝入單個巨大的try塊就象是出門旅游時把所有日常用品塞入一個大箱子,雖然東西是帶上了,但要找出來可不容易。
一些新手常常把大量的代碼放入單個try塊,然后再在catch語句中聲明Exception,而不是分離各個可能出現異常的段落并分別捕獲其異常。這種做法為分析程序拋出異常的原因帶來了困難,因為一大段代碼中有太多的地方可能拋出Exception。
結論五:盡量減小try塊的體積。
反例之六:輸出數據不完整
代碼:7行-11行。
不完整的數據是Java程序的隱形殺手。仔細觀察這段代碼,考慮一下如果循環的中間拋出了異常,會發生什么事情。循環的執行當然是要被打斷的,其次,catch塊會執行??就這些,再也沒有其他動作了。已經輸出的數據怎么辦?使用這些數據的人或設備將收到一份不完整的(因而也是錯誤的)數據,卻得不到任何有關這份數據是否完整的提示。對于有些系統來說,數據不完整可能比系統停止運行帶來更大的損失。
較為理想的處置辦法是向輸出設備寫一些信息,聲明數據的不完整性;另一種可能有效的辦法是,先緩沖要輸出的數據,準備好全部數據之后再一次性輸出。
結論六:全面考慮可能出現的異常以及這些異常對執行流程的影響。
改寫后的代碼
根據上面的討論,下面給出改寫后的代碼。也許有人會說它稍微有點?嗦,但是它有了比較完備的異常處理機制。
OutputStreamWriter out = ... java.sql.Connection conn = ... try { Statement stat = conn.createStatement(); ResultSet rs = stat.executeQuery( "select uid, name from user"); while (rs.next()) { out.println("ID:" + rs.getString("uid") + ",姓名: " + rs.getString("name")); } } catch(SQLException sqlex) { out.println("警告:數據不完整"); throw new ApplicationException("讀取數據時出現SQL錯誤", sqlex); } catch(IOException ioex) { throw new ApplicationException("寫入數據時出現IO錯誤", ioex); } finally { if (conn != null) { try { conn.close(); } catch(SQLException sqlex2) { System.err(this.getClass().getName() + ".mymethod - 不能關閉數據庫連接: " + sqlex2.toString()); } } if (out != null) { try { out.close(); } catch(IOException ioex2) { System.err(this.getClass().getName() + ".mymethod - 不能關閉輸出文件" + ioex2.toString()); } } } |
本文的結論不是放之四海皆準的教條,有時常識和經驗才是最好的老師。如果你對自己的做法沒有百分之百的信心,務必加上詳細、全面的注釋。
另一方面,不要笑話這些錯誤,不妨問問你自己是否真地徹底擺脫了這些壞習慣。即使最有經驗的程序員偶爾也會誤入歧途,原因很簡單,因為它們確確實實帶來了“方便”。所有這些反例都可以看作Java編程世界的惡魔,它們美麗動人,無孔不入,時刻誘惑著你。也許有人會認為這些都屬于雞皮蒜毛的小事,不足掛齒,但請記住:勿以惡小而為之,勿以善小而不為。
------------------------------------------------------------------下面是一些java異常集-------------------------------------------------------------------------------------------
算術異常類:ArithmeticExecption
空指針異常類:NullPointerException
類型強制轉換異常:ClassCastException
數組負下標異常:NegativeArrayException
數組下標越界異常:ArrayIndexOutOfBoundsException
違背安全原則異常:SecturityException
文件已結束異常:EOFException
文件未找到異常:FileNotFoundException
字符串轉換為數字異常:NumberFormatException
操作數據庫異常:SQLException
輸入輸出異常:IOException
方法未找到異常:NoSuchMethodException
java.lang.AbstractMethodError
抽象方法錯誤。當應用試圖調用抽象方法時拋出。
java.lang.AssertionError
斷言錯。用來指示一個斷言失敗的情況。
java.lang.ClassCircularityError
類循環依賴錯誤。在初始化一個類時,若檢測到類之間循環依賴則拋出該異常。
java.lang.ClassFormatError
類格式錯誤。當Java虛擬機試圖從一個文件中讀取Java類,而檢測到該文件的內容不符合類的有效格式時拋出。
java.lang.Error
錯誤。是所有錯誤的基類,用于標識嚴重的程序運行問題。這些問題通常描述一些不應被應用程序捕獲的反常情況。
java.lang.ExceptionInInitializerError
初始化程序錯誤。當執行一個類的靜態初始化程序的過程中,發生了異常時拋出。靜態初始化程序是指直接包含于類中的static語句段。
java.lang.IllegalAccessError
違法訪問錯誤。當一個應用試圖訪問、修改某個類的域(Field)或者調用其方法,但是又違反域或方法的可見性聲明,則拋出該異常。
java.lang.IncompatibleClassChangeError
不兼容的類變化錯誤。當正在執行的方法所依賴的類定義發生了不兼容的改變時,拋出該異常。一般在修改了應用中的某些類的聲明定義而沒有對整個應用重新編譯而直接運行的情況下,容易引發該錯誤。
java.lang.InstantiationError
實例化錯誤。當一個應用試圖通過Java的new操作符構造一個抽象類或者接口時拋出該異常.
java.lang.InternalError
內部錯誤。用于指示Java虛擬機發生了內部錯誤。
java.lang.LinkageError
鏈接錯誤。該錯誤及其所有子類指示某個類依賴于另外一些類,在該類編譯之后,被依賴的類改變了其類定義而沒有重新編譯所有的類,進而引發錯誤的情況。
java.lang.NoClassDefFoundError
未找到類定義錯誤。當Java虛擬機或者類裝載器試圖實例化某個類,而找不到該類的定義時拋出該錯誤。
java.lang.NoSuchFieldError
域不存在錯誤。當應用試圖訪問或者修改某類的某個域,而該類的定義中沒有該域的定義時拋出該錯誤。
java.lang.NoSuchMethodError
方法不存在錯誤。當應用試圖調用某類的某個方法,而該類的定義中沒有該方法的定義時拋出該錯誤。
java.lang.OutOfMemoryError
內存不足錯誤。當可用內存不足以讓Java虛擬機分配給一個對象時拋出該錯誤。
java.lang.StackOverflowError
堆棧溢出錯誤。當一個應用遞歸調用的層次太深而導致堆棧溢出時拋出該錯誤。
java.lang.ThreadDeath
線程結束。當調用Thread類的stop方法時拋出該錯誤,用于指示線程結束。
java.lang.UnknownError
未知錯誤。用于指示Java虛擬機發生了未知嚴重錯誤的情況。
java.lang.UnsatisfiedLinkError
未滿足的鏈接錯誤。當Java虛擬機未找到某個類的聲明為native方法的本機語言定義時拋出。
java.lang.UnsupportedClassVersionError
不支持的類版本錯誤。當Java虛擬機試圖從讀取某個類文件,但是發現該文件的主、次版本號不被當前Java虛擬機支持的時候,拋出該錯誤。
java.lang.VerifyError
驗證錯誤。當驗證器檢測到某個類文件中存在內部不兼容或者安全問題時拋出該錯誤。
java.lang.VirtualMachineError
虛擬機錯誤。用于指示虛擬機被破壞或者繼續執行操作所需的資源不足的情況。
java.lang.ArithmeticException
算術條件異常。譬如:整數除零等。
java.lang.ArrayIndexOutOfBoundsException
數組索引越界異常。當對數組的索引值為負數或大于等于數組大小時拋出。
java.lang.ArrayStoreException
數組存儲異常。當向數組中存放非數組聲明類型對象時拋出。
java.lang.ClassCastException
類造型異常。假設有類A和B(A不是B的父類或子類),O是A的實例,那么當強制將O構造為類B的實例時拋出該異常。該異常經常被稱為強制類型轉換異常。
java.lang.ClassNotFoundException
找不到類異常。當應用試圖根據字符串形式的類名構造類,而在遍歷CLASSPAH之后找不到對應名稱的class文件時,拋出該異常。
java.lang.CloneNotSupportedException
不支持克隆異常。當沒有實現Cloneable接口或者不支持克隆方法時,調用其clone()方法則拋出該異常。
java.lang.EnumConstantNotPresentException
枚舉常量不存在異常。當應用試圖通過名稱和枚舉類型訪問一個枚舉對象,但該枚舉對象并不包含常量時,拋出該異常。
java.lang.Exception
根異常。用以描述應用程序希望捕獲的情況。
java.lang.IllegalAccessException
違法的訪問異常。當應用試圖通過反射方式創建某個類的實例、訪問該類屬性、調用該類方法,而當時又無法訪問類的、屬性的、方法的或構造方法的定義時拋出該異常。
java.lang.IllegalMonitorStateException
違法的監控狀態異常。當某個線程試圖等待一個自己并不擁有的對象(O)的監控器或者通知其他線程等待該對象(O)的監控器時,拋出該異常。
java.lang.IllegalStateException
違法的狀態異常。當在Java環境和應用尚未處于某個方法的合法調用狀態,而調用了該方法時,拋出該異常。
java.lang.IllegalThreadStateException
違法的線程狀態異常。當縣城尚未處于某個方法的合法調用狀態,而調用了該方法時,拋出異常。
java.lang.IndexOutOfBoundsException
索引越界異常。當訪問某個序列的索引值小于0或大于等于序列大小時,拋出該異常。
java.lang.InstantiationException
實例化異常。當試圖通過newInstance()方法創建某個類的實例,而該類是一個抽象類或接口時,拋出該異常。
java.lang.InterruptedException
被中止異常。當某個線程處于長時間的等待、休眠或其他暫停狀態,而此時其他的線程通過Thread的interrupt方法終止該線程時拋出該異常。
java.lang.NegativeArraySizeException
數組大小為負值異常。當使用負數大小值創建數組時拋出該異常。
java.lang.NoSuchFieldException
屬性不存在異常。當訪問某個類的不存在的屬性時拋出該異常。
java.lang.NoSuchMethodException
方法不存在異常。當訪問某個類的不存在的方法時拋出該異常。
java.lang.NullPointerException
空指針異常。當應用試圖在要求使用對象的地方使用了null時,拋出該異常。譬如:調用null對象的實例方法、訪問null對象的屬性、計算null對象的長度、使用throw語句拋出null等等。
java.lang.NumberFormatException
數字格式異常。當試圖將一個String轉換為指定的數字類型,而該字符串確不滿足數字類型要求的格式時,拋出該異常。
java.lang.RuntimeException
運行時異常。是所有Java虛擬機正常操作期間可以被拋出的異常的父類。
java.lang.SecurityException
安全異常。由安全管理器拋出,用于指示違反安全情況的異常。
java.lang.StringIndexOutOfBoundsException
字符串索引越界異常。當使用索引值訪問某個字符串中的字符,而該索引值小于0或大于等于序列大小時,拋出該異常。
java.lang.TypeNotPresentException
類型不存在異常。當應用試圖以某個類型名稱的字符串表達方式訪問該類型,但是根據給定的名稱又找不到該類型是拋出該異常。該異常與ClassNotFoundException的區別在于該異常是unchecked(不被檢查)異常,而ClassNotFoundException是checked(被檢查)異常。
java.lang.UnsupportedOperationException
不支持的方法異常。指明請求的方法不被支持情況的異常。
異常
javax.servlet.jsp.JspException: Cannot retrieve mapping for action /Login (/Login是你的action名字)
可能原因
action沒有再struts-config.xml 中定義,或沒有找到匹配的action,例如在JSP文件中使用 <html:form action="Login.do".將表單提交給Login.do處理,如果出現上述異常,請查看struts-config.xml中的定義部分,有時可能是打錯了字符或者是某些不符合規則,可以使用strutsconsole工具來檢查。
-----------------------------------------------------------------------------------------------------------------
異常
org.apache.jasper.JasperException: Cannot retrieve definition for form bean null
可能原因
這個異常是因為Struts根據struts-config.xml中的mapping沒有找到action期望的form bean。大部分的情況可能是因為在form-bean中設置的name屬性和action中設置的name屬性不匹配所致。換句話說,action和form都應該各自有一個name屬性,并且要精確匹配,包括大小寫。這個錯誤當沒有name屬性和action關聯時也會發生,如果沒有在action中指定name屬性,那么就沒有name屬性和action相關聯。當然當action制作某些控制時,譬如根據參數值跳轉到相應的jsp頁面,而不是處理表單數據,這是就不用name屬性,這也是action的使用方法之一。
-----------------------------------------------------------------------------------------------------------------
異常
No action instance for path /xxxx could be created
可能原因
特別提示:因為有很多中情況會導致這個錯誤的發生,所以推薦大家調高你的web服務器的日志/調試級別,這樣可以從更多的信息中看到潛在的、在試圖創建action類時發生的錯誤,這個action類你已經在struts-config.xml中設置了關聯(即添加了<action>標簽)。
在struts-config.xml中通過action標簽的class屬性指定的action類不能被找到有很多種原因,例如:定位編譯后的.class文件失敗。Failure to place compiled .class file for the action in the classpath (在web開發中,class的的位置在r WEB-INF/classes,所以你的action class必須要在這個目錄下。例如你的action類位于WEB-INF/classes/action/Login.class,那么在struts-config.xml中設置action的屬性type時就是action.Login).
拼寫錯誤,這個也時有發生,并且不易找到,特別注意第一個字母的大小寫和包的名稱。
-----------------------------------------------------------------------------------------------------------------
異常
javax.servlet.jsp.JspException: No getter method for property username of bean org.apache.struts.taglib.html.BEAN
可能原因
沒有位form bean中的某個變量定義getter 方法
這個錯誤主要發生在表單提交的FormBean中,用struts標記<html:text property=”username”>時,在FormBean中必須有一個getUsername()方法。注意字母“U”。
-----------------------------------------------------------------------------------------------------------------
異常
java.lang.NoClassDefFoundError: org/apache/struts/action/ActionForm
可能原因
這個錯誤主要發生在在classpath中找不到相應的Java .class文件。如果這個錯誤發生在web應用程序的運行時,主要是因為指定的class文件不在web server的classpath中(/WEB-INF/classes 和 /WEB-INF/lib)。在上面的錯誤中,原因是找不到ActionForm類。
-----------------------------------------------------------------------------------------------------------------
異常
javax.servlet.jsp.JspException: Exception creating bean of class org.apache.struts.action.ActionForm: {1}
可能原因
Instantiating Struts-provided ActionForm class directly instead of instantiating a class derived off ActionForm. This mightoccur implicitly if you specify that a form-bean is this Struts ActionForm class rather than specifying a child of this classfor the form-bean.
Not associating an ActionForm-descended class with an action can also lead to this error.
-----------------------------------------------------------------------------------------------------------------
異常
javax.servlet.jsp.JspException: Cannot find ActionMappings or ActionFormBeans collection
可能原因
不是標識Struts actionServlet的<servlet>標記就是映射.do擴展名的<sevlet-mapping>標記或者兩者都沒有在web.xml中聲明。
在struts-config.xml中的打字或者拼寫錯誤也可導致這個異常的發生。例如缺少一個標記的關閉符號/>。最好使用struts console工具檢查一下。
另外,load-on-startup必須在web.xml中聲明,這要么是一個空標記,要么指定一個數值,這個數值用來表servlet運行的優先級,數值越大優先級越低。
還有一個和使用load-on-startup有關的是使用Struts預編譯JSP文件時也可能導致這個異常。
-----------------------------------------------------------------------------------------------------------------
異常
java.lang.NullPointerException at org.apache.struts.util.RequestUtils.forwardURL(RequestUtils.java:1223)
可能原因
在struts-config.xml中的forward元素缺少path屬性。例如應該是如下形式:
<forward name="userhome" path="/user/userhome.jsp"/>
-----------------------------------------------------------------------------------------------------------------
異常
javax.servlet.jsp.JspException: Cannot find bean org.apache.struts.taglib.html.BEAN in any scope
Probable Causes
試圖在Struts的form標記外使用form的子元素。這常常發生在你在</html:form>后面使用Struts的html標記。另外要注意可能你不經意使用的無主體的標記,如<html:form … />,這樣web 服務器解析時就當作一個無主體的標記,隨后使用的所有<html>標記都被認為是在這個標記之外的,如又使用了<html:text property=”id”>還有就是在使用taglib引入HTML標記庫時,你使用的prefix的值不是html。
-----------------------------------------------------------------------------------------------------------------
異常
javax.servlet.jsp.JspException: Missing message for key xx.xx.xx
Probable Causes
這個key的值對沒有在資源文件ApplicationResources.properties中定義。如果你使用eclipse時經常碰到這樣的情況,當項目重新編譯時,eclipse會自動將classes目錄下的資源文件刪除。
資源文件ApplicationResources.properties 不在classpath中應將資源文件放到 WEB-INF/classes 目錄下,當然要在struts-config.xml中定義)
-----------------------------------------------------------------------------------------------------------------
異常
Cannot find message resources under key org.apache.struts.action.MESSAGE
可能原因
很顯然,這個錯誤是發生在使用資源文件時,而Struts沒有找到資源文件。
Implicitly trying to use message resources that are not available (such as using empty html:options tag instead of specifyingthe options in its body -- this assumes options are specified in ApplicationResources.properties file)
XML parser issues -- too many, too few, incorrect/incompatible versions
-----------------------------------------------------------------------------------------------------------------
異常
Strange and seemingly random characters in HTML and on screen, but not in original JSP or servlet.
可能原因
混和使用Struts的html:form標記和標準的HTML標記不正確。
使用的編碼樣式在本頁中不支持。
-----------------------------------------------------------------------------------------------------------------
異常
"Document contained no data" in Netscape
No data rendered (completely empty) page in Microsoft Internet Explorer
可能原因
使用一個Action的派生類而沒有實現perform()方法或execute()方法。在Struts1.0中實現的是perform()方法,在Struts1.1中實現的是execute()方法,但Struts1.1向后兼容perform()方法。但你使用Struts1.1創建一個Action的派生類,并且實現了execute()方法,而你在Struts1.0中運行的話,就會得到"Document contained nodata" error message in Netscape or a completely empty (no HTML whatsoever) page rendered in Microsoft Internet Explorer.”的錯誤信息。
---------------------------------------------------------------------------------------------------------------------------
異常
ServletException: BeanUtils.populate
解決方案
在用Struts上傳文件時,遇到了javax.servlet.ServletException: BeanUtils.populate異常。
我的ActionServlet并沒有用到BeanUtils這些工具類。后來仔細檢查代碼發現是在jsp文件里的form忘了加enctype="multipart/form-data" 了。所以寫程序遇到錯誤或異常應該從多方面考慮問題存在的可能性,想到系統提示信息以外的東西。
----------------------------------------------------------------------------------------------------------------------------
1. 定義Action后, 如果指定了name, 那么必須要定義一個與它同名的FormBean才能進行form映射.2. 如果定義Action后, 提交頁面時出現 "No input attribute for mapping path..." 錯誤, 則需要在其input屬性中定義轉向的頁面.3. 如果插入新的數據時出現 "Batch update row count wrong:..." 錯誤, 則說明XXX.hbm.xml中指定的key的類型為原始類型(int, long),因為這種類型會自動分配值, 而這個值往往會讓系統認為已經存在該記錄, 正確的方法是使用java.lang.Integer或java.lang.Long對象.4. 如果插入數據時出現 "argument type mismatch" 錯誤, 可能是你使用了Date等特殊對象, 因為struts不能自動從String型轉換成Date型,所以, 你需要在Action中手動把String型轉換成Date型.5. Hibernate中, Query的iterator()比list()方法快很多.6. 如果出現 "equal symbol expected" 錯誤, 說明你的strtus標簽中包含另一個標簽或者變量, 例如:
<html:select property="test" onchange="<%=test%>"/>
或者
<html:hidden property="test" value="<bean:write name="t" property="p"/>"/>
這樣的情況...
---------------------------------------------------------------------------------------------------------------------------
錯誤:Exception in thread "main" org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update原因與解決: 因為Hibernate Tools(或者Eclipse本身的Database Explorer)生成*.hbn.xml工具中包含有catalog="***"(*表示數據庫名稱)這樣的屬性,將該屬性刪除就可以了
---------------------------------------------------------------------------------------------------------------------------
錯誤:org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations)
原因與解決:
方法1 刪除Set方的cascade
方法2 解決關聯關系后,再刪除
方法3 在many-to-one方增加cascade 但值不能是none
最后一招:
檢查一下hashCode equals是否使用了id作為唯一標示的選項了;我用uuid.hex時是沒有問題的;但是用了native,就不行了,怎么辦?刪除啊!
----------------------------------------------------------------------------------------------------------------------------
問題:今天用Tomcat 5.5.12,發現原來很好用的系統不能用了,反復測試發現頁面中不能包含 taglib,否則會出現以下提示:HTTP Status 500 -type Exception reportMessage description The server encountered an internal error () that prevented it from fulfilling this request.exceptionorg.apache.jasper.JasperException: /index.jsp(1,1) Unable to read TLD "META-INF/tlds/struts-bean.tld" from JAR file"file:*****/WEB-INF/lib/struts.jar":原因:更新了工程用的lib文件夾下的jar,發布時也發布了servlet.jar和jsp-api.jar。解決:把jsp-api.jar刪除就解決這個問題了。-----------------------------------------------------------------------------------------------------------------------------
錯誤: java.lang.NullPointerException
原因: 發現 dao 實例、 manage 實例等需要注入的東西沒有被注入(俗稱空指針異常)解決:這個時候,你應該查看日志文件;默認是應用服務器的 log 文件,比如 Tomcat 就是 [Tomcat 安裝目錄 ]/logs ;你會發現提示你:可能是:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sf' defined in ServletContextresource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception isorg.hibernate.HibernateException: could not configure from URL: file:src/hibernate.cfg.xmlorg.hibernate.HibernateException: could not configure from URL: file:src/hibernate.cfg.xml……………………….Caused by: java.io.FileNotFoundException: src\hibernate.cfg.xml可能是:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined inServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception isorg.hibernate.MappingException: Resource: com/mcc/coupon/model/UserRole.hbm.xml not foundorg.hibernate.MappingException: Resource: com/mcc/coupon/model/UserRole.hbm.xml not found然后你就知道原因是因為配置文件的解析出了錯誤,這個通過 Web 頁面是看不出來的。更多的是持久化影射文件出的錯誤;導致了沒有被解析;當然你需要的功能就無法使用了。
----------------------------------------------------------------------------------------------------------------------------
錯誤:StandardWrapperValve[action]: Servlet.service() for servlet action threw exception
javax.servlet.jsp.JspException: Cannot retrieve mapping for action /settlementTypeManage
或者: type Status report message Servlet action is not available description The requested resource (Servlet action is not available) is not available.
原因: 同 上
----------------------------------------------------------------------------------------------------------------------------
錯誤StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exceptionjava.lang.ClassNotFoundException: org.apache.struts.taglib.bean.CookieTei界面錯誤具體描述:
org.apache.jasper.JasperException: Failed to load or instantiate TagExtraInfo class: org.apache.struts.taglib.bean.CookieTei
原因與解決: <方案一>你的“html:”開頭的標簽沒有放在一個<html:form>中 <方案二>重新啟動你的應用服務器,自動就沒有這個問題
posted @ 2009-08-10 10:32 AntiquMan 閱讀(448) | 評論 (1) | 編輯 收藏
2.改變安裝文件權限。在終端中用cd命令把當前目錄轉移到jdk-6u3--i586-rpm.bin所在目錄,用ls -l命令查看文件權限,如果是可執行x(eXecute)則不需要更改,否則用命令 chmod 755 jdk-6u3--i586-rpm.bin,使自解壓包文件可執行
3.安裝。在終端輸入。/jdk-6u3-Linux-i586-rpm.bin,按提示一步步執行即可。
4.更改環境變量。剛才安裝的版本默認在/usr/Java/jdk1.6.0_03,我們把它加到環境變量。用cd命令轉移到etc目錄,輸入gedit profile,在profile在后三行
#
# End of /etc/profile
#
上面添加如下文本:
export JAVA_HOME=/usr/java/jdk1.6.0_03
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
export JRE_HOME=$JAVA_HOME/jre
5.重新啟動系統,在終端輸入java -version,顯示內容:
java version "1.6.0_03"
(TM) SE Runtime Environment (build 1.6.0_03-b05)
HotSpot(TM) Client VM (build 1.6.0_03-b05, mixed mode, sharing)
說明環境變量設置成功。
posted @ 2009-08-10 10:22 AntiquMan 閱讀(185) | 評論 (0) | 編輯 收藏
基本演示了線程池和隊列的應用
public class WorkQueue {
private final int nThreads;//線程池的大小
private final PoolWorker[] threads;//用數組實現線程池
private final LinkedList queue;//任務隊列
public WorkQueue(int nThreads){
this.nThreads = nThreads;
queue = new LinkedList();
threads = new PoolWorker[nThreads];
for (int i=0; i<nThreads;i++){
threads[i] = new PoolWorker();
threads[i].start();//啟動所有工作線程
}
}
public void execute(Runnable r) {//任務
synchronized(queue) {
queue.addLast(r);
queue.notify();
}
}
private class PoolWorker extends Thread {//工作線程類
public void run() {
Runnable r;
while (true) {
synchronized(queue) {
while (queue.isEmpty()) {//如果任務隊列中沒有任務,等待
try{
queue.wait();
}catch (InterruptedException ignored){}
}
r = (Runnable) queue.removeFirst();//有任務時,取出任務
}
try {
r.run();//執行任務
}catch (RuntimeException e) {
// You might want to log something here
}
}
}
}
public static void main(String args[]){
WorkQueue wq=new WorkQueue(10);//10個工作線程
Mytask r[]=new Mytask[20];//20個任務
for(int i=0;i<20;i++){
r[i]=new Mytask();
wq.execute(r[i]);
}
}
}
class Mytask implements Runnable{//任務接口
public void run(){
String name=Thread.currentThread().getName();
try{
Thread.sleep(100);//模擬任務執行的時間
}catch(InterruptedException e){}
System.out.println(name+" executed OK");
}
}
posted @ 2009-08-03 18:18 AntiquMan 閱讀(200) | 評論 (0) | 編輯 收藏
上周在優化預警分析的工作中,發現由于分頁功能需要提供總條數 ,項目組內的普遍做法是進行兩次sql查詢,一次用count(*)獲得總條數,一次獲取真正的展現數據。其實oracle提供了olap函數對此進行優化,可通過偽列:count(*) over()獲得當前sql的總條數。
SAMPLE:下面例子中計算每個員工在按薪水排序中當前行附近薪水在[n-50,n+150]之間的行數,n表示當前行的薪水
例如,Philtanker的薪水2200,排在他之前的行中薪水大于等于2200-50的有1行,排在他之后的行中薪水小于等于2200+150的行沒有,所以count計數值cnt3為2(包括自己當前行);cnt2值相當于小于等于當前行的SALARY值的所有行數
SELECT last_name, salary, COUNT(*) OVER () AS cnt1,
COUNT(*) OVER (ORDER BY salary) AS cnt2,
COUNT(*) OVER (ORDER BY salary RANGE BETWEEN 50 PRECEDING AND 150 FOLLOWING) AS cnt3 FROM employees;
結果如下 :
LAST_NAME | SALARY | CNT2 | CNT2 | CNT3 |
Olson | 2100 | 107 | 1 | 3 |
Markle | 2200 | 107 | 3 | 2 |
Philtanker | 2200 | 107 | 3 | 2 |
Landry | 2400 | 107 | 5 | 8 |
Gee | 2400 | 107 | 5 | 8 |
Colmenares | 2500 | 107 | 11 | 10 |
Patel | 2500 | 107 | 10 | 10 |
posted @ 2009-08-03 18:11 AntiquMan 閱讀(322) | 評論 (0) | 編輯 收藏
01.
//Copyright © 2009. Http://L4cd.Net All Rights Reserved.
02.
package
net.L4cd.display
03.
{
04.
import
flash.events.Event;
05.
import
flash.events.TextEvent;
06.
import
flash.text.TextField;
07.
import
flash.utils.ByteArray;
08.
09.
/**
10.
* 擴展TextField類,中文以2字符長度計算
11.
*
12.
* @author L4cd.Net
13.
* @playerversion Flash player 9
14.
* @langversion 3.0
15.
* @version 2009-06-16
16.
*/
17.
public
class
TextFieldExt
extends
TextField
18.
{
19.
private
var
_maxChars:
int
= -
1
;
20.
public
function
TextFieldExt()
21.
{
22.
super
();
23.
24.
}
25.
override
public
function
get
maxChars():
int
26.
{
27.
return
_maxChars;
28.
}
29.
override
public
function
set
maxChars(value:
int
):
void
30.
{
31.
_maxChars = value;
32.
if
(maxChars<
0
)
33.
{
34.
removeEventListener(TextEvent.TEXT_INPUT,input);
35.
}
else
36.
{
37.
addEventListener(TextEvent.TEXT_INPUT,input);
38.
text = getTextByCharLength(text,maxChars);
39.
}
40.
}
41.
override
public
function
get
length():
int
42.
{
43.
return
getCharLength(text);
44.
}
45.
private
function
input(e:TextEvent):
void
46.
{
47.
//攔截并阻止textinput事件,手動處理內容輸入
48.
var
textField:TextField = e.currentTarget
as
TextField;
49.
var
temp:
String
= getTextByCharLength(e.text,maxChars - getCharLength(text) + getCharLength(selectedText));
50.
var
index:
int
= selectionBeginIndex;
51.
replaceText(selectionBeginIndex,selectionEndIndex,temp);
52.
setSelection(index+temp.length,index+temp.length);
53.
dispatchEvent(
new
Event(Event.CHANGE,
true
));
54.
e.preventDefault();
55.
}
56.
/**
57.
* 獲取字符長度,一個中文算2長度
58.
* @param txt
59.
* @return 返回長度值
60.
*/
61.
private
function
getCharLength(txt:
String
):
int
62.
{
63.
var
byte:ByteArray =
new
ByteArray();
64.
byte.writeMultiByte(txt,
"gb2312"
);
65.
byte.position =
0
;
66.
return
byte.bytesAvailable;
67.
}
68.
/**
69.
* 截取指定長度的文本內容,一個中文算2長度
70.
* @param txt 需要截取的文本
71.
* @param length 需要截取的長度
72.
* @return 截取后的內容
73.
*/
74.
private
function
getTextByCharLength(txt:
String
,length:
int
):
String
75.
{
76.
if
(length<
1
)
return
""
;
77.
var
byte:ByteArray =
new
ByteArray();
78.
byte.writeMultiByte(txt,
"gb2312"
);
79.
byte.position =
0
;
80.
return
byte.readMultiByte(Math.min(length,byte.bytesAvailable),
"gb2312"
);
81.
}
82.
}
83.
}
調用方法和普通TextField無異
1.
import
net.L4cd.display.TextFieldExt
2.
var
ext:TextFieldExt =
new
TextFieldExt();
3.
ext.maxChars =
15
;
4.
addChild(ext);
一般的輸入,粘貼等操作均沒問題..
直接對text進行賦值沒有進行限制 (原來的TextField也沒限制)..
如需限制~可以調用一次maxChars = maxChars即可..
posted @ 2009-07-03 14:47 AntiquMan 閱讀(516) | 評論 (0) | 編輯 收藏
private int x = 100;
public int getX() {
return x;
}
public int fix(int y) {
x = x - y;
return x;
}
}
private Foo foo = new Foo();
public static void main(String[] args) {
MyRunnable r = new MyRunnable();
Thread ta = new Thread(r, "Thread-A");
Thread tb = new Thread(r, "Thread-B");
ta.start();
tb.start();
}
public void run() {
for (int i = 0; i < 3; i++) {
this.fix(30);
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " : 當前foo對象的x值= " + foo.getX());
}
}
public int fix(int y) {
return foo.fix(y);
}
}
Thread-B : 當前foo對象的x值= 40
Thread-B : 當前foo對象的x值= -20
Thread-A : 當前foo對象的x值= -50
Thread-A : 當前foo對象的x值= -80
Thread-B : 當前foo對象的x值= -80
Process finished with exit code 0
6)、線程睡眠時,它所持的任何鎖都不會釋放。
synchronized (this) {
x = x - y;
}
return x;
}
return x++;
}
synchronized (this) {
return x;
}
}
public static int setName(String name){
synchronized(Xxx.class){
Xxx.name = name;
}
}
private List nameList = Collections.synchronizedList(new LinkedList());
public void add(String name) {
nameList.add(name);
}
public String removeFirst() {
if (nameList.size() > 0) {
return (String) nameList.remove(0);
} else {
return null;
}
}
}
public static void main(String[] args) {
final NameList nl = new NameList();
nl.add("aaa");
class NameDropper extends Thread{
public void run(){
String name = nl.removeFirst();
System.out.println(name);
}
}
Thread t1 = new NameDropper();
Thread t2 = new NameDropper();
t1.start();
t2.start();
}
}
是同步的,但是程序還不是線程安全的。
private List nameList = Collections.synchronizedList(new LinkedList());
public synchronized void add(String name) {
nameList.add(name);
}
public synchronized String removeFirst() {
if (nameList.size() > 0) {
return (String) nameList.remove(0);
} else {
return null;
}
}
}
private static class Resource {
public int value;
}
private Resource resourceA = new Resource();
private Resource resourceB = new Resource();
public int read() {
synchronized (resourceA) {
synchronized (resourceB) {
return resourceB.value + resourceA.value;
}
}
}
public void write(int a, int b) {
synchronized (resourceB) {
synchronized (resourceA) {
resourceA.value = a;
resourceB.value = b;
}
}
}
}
posted @ 2009-07-03 14:45 AntiquMan 閱讀(145) | 評論 (0) | 編輯 收藏