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 阅读(351) | 评论 (0)编辑 收藏

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

posted @ 2009-06-02 12:44 AntiquMan 阅读(161) | 评论 (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 阅读(1165) | 评论 (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 阅读(187) | 评论 (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 阅读(181) | 评论 (0)编辑 收藏

posted @ 2009-03-31 01:07 AntiquMan 阅读(222) | 评论 (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 阅读(574) | 评论 (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 阅读(149) | 评论 (0)编辑 收藏

仅列出标题
共4页: 上一页 1 2 3 4