pregoURL
URL是Uniform Resource Location的缩写,译为"统一资源定位符"。通俗地说,URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。
目前最大的缺点是当信息资源的存放地点发生变化时,必须对URL作相应的改变。因此人们正在研究新的信息资源表示方法,例如:URI(Universal Resource Identifier)即"通用资源标识"(参见RFC 1630)、URN(Uniform Resource Name)即"统一资源名"和URC(Uniform Resource Citation)即"统一资源引用符"等。
a什么意思URL(Uniform Resoure Locator 统一资源定位器)是WWW网页的地址,好比一个街道在城市地图上地址。url使用数字和字母按一定顺序排列以确定一个地址。
URL的第一个部分表示的是要访问的文件的类型。在网上,这几乎总是使用http(意思是超文本转换协议,hypertext transfer protocol.因为它是用来转换网页的协议.)有时也使用ftp(file transferprotocol),意为文件传输协议,主要用来传输软件和大文件(许多做软件下载的网站就使用ftp作为下载的网址);telenet(远程登录),主要用于远程交谈;以及文件调用等,意思是浏览器正在阅读本地盘外的一个文件,而不是一个远程计算机.
URL从左到右由下述部分组成:
·Internet资源类型(scheme):指出WWW 客户程序用来C作的工具。如“”表示WWW服务器,“ftp://”表示FTP服务器,“gopher://”表示Gopher服务器,而“new:”表示Newgroup新闻组。
·服务器地址(host):指出WWW 网页所在的服务器域名。
·端口(port):有时(并非总是这样),对某些资源的访问来说,需给出相应的服务器提供端口号。
·路径(path):指明服务器上某资源的位置(其格式与DOS系统中的格式一样,通常有目录/子目录/文件名这样结构组成)。与端口一样,路径并非总是需要的。
URL地址格式排列为:scheme://host:port/path
例如/bbs 就是一个典型的URL地址。
客户程序首先看到http(超文本传送协议),便知道处理的是HTML链接。接下来的是站点地址,最后是目录/bbs
必须注意,WWW 上的服务器都是区分大小写字母的,所以,千万要注意正确的URL大小写表达形式。
URI
1.什么是URI
Web上可用的每种资源 - HTML文档、图像、视频片段、程序等 - 由一个通
用资源标志符(Universal Resource Identifier, 简称"URI")进行定位。
URI一般由三部分组成:
访问资源的命名机制。
存放资源的主机名。
资源自身的名称,由路径表示。
考虑下面的URI,它表示了当前的HTML 4.
0规范:
/html/html40/
这个URI是这样的:这是一个可通过HTTP协议访问的资源,位于主
机上,通过路径“/html/html40”访问。在HTML文档中
其它资源包括"mailto"(收发email)和"ftp"(FTP访问)。
这是URI的另一个例子,指向一个用户的邮箱:
mailto:
注:大多数读者可能熟悉"URL",而不是URI。URL是URI命名机制的一个子集。
片段标志符
有的URI指向一个资源的内部。 这种URI以"#"结束,并跟着一个anchor标志
符(称为片段标志符)。例如,下面是一个指向ction_2的URI:
/html/top.htm#ction_2
xor 相对URI
相对URI 不包含任何命名规范信息。它的路径通常指同一台机器上的资源。相
mba课程
对URI可能含有相对路径(如,“..”表示上一层路径),还可能包含片段标
志符。
为了说明相对URI,假设我们有一个基本的URI /support/intro.htm
下面的链接中使用了相对URI:
Suppliers
它扩展成完全的URI就是 "/support/suppliers.htm",
下面是一个图像的相对URI:
<IMG src="../icons/logo.gif" alt="logo">
它扩展成完全的URI就是 "/icons/logo.gif"。
在HTML中,URI被用来:
链接到另一个文档或资源(参看A和LINK元素)。
链接到一个外部样式表或脚本(参看LINK和SCRIPT元素)。
在页内包含图像、对象或applet(参看IMAG、OBJECT、APPLET和INPUT
元素)。
建立图像映射(参看MAP和AREA元素)。
提交一个表单(参看FORM)。
建立一个框架文档(参看FRAME和IFRAME元素)。
引用一个外部参考(参看Q、BLOCKQUOTE, INS和DEL元素)。
指向一个描述文档的metadata(参看HEAD元素)。
区别
◇ URL的格式
URL的格式由下列三部分组成:
第一部分是协议(或称为服务方式);
第二部分是存有该资源的主机IP地址(有时也包括端口号);
第三部分是主机资源的具体地址。,如目录和文件名等。
第一部分和第二部分之间用“://”符号隔开,第二部分和第三部分用“/”符号隔开。第一部分和第二部分是不可缺少的,第三部分有时可以省略。红楼梦英语
◇ URL示例
文件的URL:
用URL表示文件时,服务器方式用file表示,后面要有主机IP地址、文件的存取路径(即目录)和文件名等信息。有时可以省略目录和文件名,但“/”符号不能省略。
例一:file:///pub/
代表存放主机上的pub/files/目录下的一个文件,文件名是。
例二:file:///pub
代表主机上的目录/pub。
例三:file:///
代表主机上的根目录。
Gopher的URL:
Gopher服务器有可能使用特殊的端口,在这种情况下,主机IP地址与端口之间要用“:隔开。
例一:gopher:///
表示主机上的gopher服务器。
例二:gopher://gopher.banzai.edu:1234
表示主机gopher.banzai.edu上的gopher服务器,在端口1234上。
网络新闻的URL:
利用URL表示网络新闻组时,如果是unet的话只要指定出新闻组的名字即可。
例如:news:rec.gardening
表示unet上的rec.gardening新闻组(园艺)。
HTTP的 URL:
使用超级文本传输协议HTTP,提供超级文本信息服务的资源。
例一:/channel/welcome.htm
其计算机域名为。超级文本文件(文件类型为.html)是在目录/channel下的welcome.htm。这是中国人民日报的一台计算机。
例二:l/talk/talk1.htm
其其计算机域名为l。超级文本文件(文件类型为.html)是在目录/talk下的talk1.htm。这是瑞得聊天室的地址,可由此进入瑞得聊天室的第1室。
URI、URL和URN之间的区别与联系
URI:Uniform Resource Identifier,统一资源标识符;
URL:Uniform Resource Locator,统一资源定位符;
URN:Uniform Resource Name,统一资源名称。
其中,URL,URN是URI的子集。
Web上地址的基本形式是URI,它代表统一资源标识符。有两种形式:
URL:目前URI的最普遍形式就是无处不在的URL或统一资源定位器。
URN:URL的一种更新形式,统一资源名称(URN, Uniform Resource Name)不依赖于位置,并且有可能减少失效连接的个数。但是其流行还需假以时日,因为它需要更精密软件的支持。
URI是以某种统一的(标准化的)方式标识资源的简单字符串。
典型情况下,这种字符串以scheme(命名URI的名字空间的标识符——一组相关的名称)开头,语法如下:
[scheme:] scheme-specific-part
URI以scheme和冒号开头。Scheme用大写/小写字母开头,后面为空或者跟着更多的大写/小写字母、数字、加号、减号和点号。冒号把scheme与scheme-specific-part分开了,并且scheme-specific-part的语法和语义(意思)由URI的名字空间决定。如下面的例子:
,其中http是scheme,//是 scheme-specific-part,并且它的scheme与scheme-specific-part被冒号分开了。
URI有绝对和相对之分,绝对的URI指以scheme(后面跟着冒号)开头的URI。前面提到的www
<就是绝对的URI的一个例子,其它的例子还有mailto:、news:comp.lang.java.help和xyz://whatever。你可以把绝对的URI看作是以某种方式引用某种资源,而这种方式对标识符出现的环境没有依赖。如果使用文件系统作类比,绝对的URI类似于从根目录开始的某个文件的径。
与绝对的URI不同的,相对的URI不是以scheme(后面跟着冒号)开始的URI。 它的一个例子是articles/articles.html。你可以把相对的URI看作是以某种方式引用某种资源,而这种方式依赖于标识符出现的环境。如果用文件系统作类比,相对的URI类似于从当前目录开始的文件路径。
一直不敢写点什么,是因为战战兢兢,生怕写的不好甚至写错了会误人子弟。随笔可以随便写一下,不用太过计较,可是技术从来都要不得半点马虎,差之毫厘,谬以千里啊!但敝帚自珍又不是我的风格,虽然文笔不好,也要勉为其难了。废话少说,进入正题。
从我开始接触Java的多线程起就总是觉得书上讲的不是那么清楚。不是说读完了不会写,而是对写出来的多线程代码懵懵懂懂,不知道每一句会有什么影响,心里感觉忐忑。后来仔细研读Java语言规范后,才慢慢搞明白一些细节。我主要想说的,也就是这些经验吧。
首先要搞清楚的是线程的共享资源,共享资源是多线程中每个线程都要访问的类变量或实例变量,共享资源可以是单个类变量或实例变量,也可以是一组类变量或实例变量。多线程程序可以有多个共享资源。下面描述他们之间的一对多关系(*表示多):
多线程程序(1)----共享资源(*)----类变量或实例变量(1…*)
只有类变量和实例变量可以成为共享资源,细分如下:
<!--[if !supportLists]-->1. <!--[endif]-->实现线程的类(继承Thread类、实现Runnable接口的类)的类变量、实例变量。
<!--[if !supportLists]-->2. <!--[endif]-->实现线程的类的类变量、实例变量的类变量、实例变量,可以不
规范的写为:TreadClass.ClassOrInstanceVar[.ClassOrInstanceVar]*,[]*的内容表示无限可重复。
<!--[if !supportLists]-->3. <!--[endif]-->不是实现线程的类,但其对象可能是线程的类变量或实例变量。如Servlet、EJB。这些类的类变量和实例变量,不规范的写为:ServletOrEJB.ClassOrInstanceVar[.ClassOrInstanceVar]*。
<!--[if !supportLists]-->4. <!--[endif]-->特别注意:局部变量、做为参数传递的非类变量、非实例变量不是共享资源。
那么什么是线程安全呢?关于这个问题我在网上百度了一下(没办法,有时候GOOGLE用不了),发现不少人在问这个问题,也有不少错误的理解。所以我给出一个较容易理解的解释:在线程中使用共享资源时,能够保证共享资
源在任何时候都是原子的、一致的,这样的线程就是线程安全的线程。还不太理解?没有关系,慢慢解释。
首先来介绍一下共享资源的类型(这是我自己分类的,为了后文好解释),共享资源从其类型可以分为三类(下文讲到变量一律指类变量或实例变量,不再特别指出):
<!--[if !supportLists]-->1. <!--[endif]-->独立的基本类型共享资源,如一个简单的int变量,例:
public class Cls1 {
private int a;
public int getA(){return a;}
public void tA(int a){this.a = a;}
}
可以看到a没有任何依赖。
public class Cls2{
private int a;
private int b;
private int c;
// 没有对a的访问方法,a在Cls外不可见。
}
假设上面类中b、c都不依赖a,则a是这种类型。
<!--[if !supportLists]-->2. <!--[endif]-->相互依赖的基本类型共享资源,一个类中的几个基本类型变量互相依赖,但从对象设计的角度又不能单独把这几个变量设计成一个类。
假设上例Cls2中的b、c互相依赖,则属此种情况。
<!--[if !supportLists]-->3. <!--[endif]-->64位的基本类型变量。这个比较特殊,因为某些机器上64变量会分成两个32位的操作,所以和1不一样。如double、long类型。
<!--[if !supportLists]-->4. <!--[endif]-->类类型的共享资源。如下例中的obj:
public class Cls3{
private SomeObj obj;
}
public class SomeObj{
private int a;
private int b;
}
其次来看看什么是原子性、一致性。其实在这里我借用了事务ACID属性的A和C,熟悉的朋友就不用我废话了。所谓原子性,是指一个共享资源的所有属性在任何时刻都是一起变化、密不可分的;所谓一致性,是指一个共享资源的所有属性在变化之后一定会达到一个一致的状态。
最后根据上述四种共享资源类型,来看看如何做到线程安全。
<!--[if !supportLists]-->1. <!--[endif]-->不用做什么,只一个独立的变量,任何时候它都是原子、一致的。
<!--[if !supportLists]-->2. <!--[endif]-->使用synchronized关键字,保证几个变量被一起修改、一起读取。
<!--[if !supportLists]-->3. <!--[endif]-->使用volatile关键字,然后就和1一样了。
<!--[if !supportLists]-->4. <!--[endif]-->和2一样处理。
当对访问共享资源的方法不同时使用synchronized关键字时,是什么样一种情况呢?这是需要特别注意的,这样不能保证线程安全!看看下面例子的运行结果就知道了(自己运行啊,我不贴结果了):
/**
* $Author: $
* $Date: $
知足常乐 英文* $Revision: $
* $History: $
*
claimed* Created by feelyou, at time 22:31:53, 2005-11-16.
*/
public class TestThread extends Thread {
private int a = 0;
private int b = 0;
public static void main(String[] args) {
TestThread test = new TestThread();
for (int i = 0; i < 10; i++) {
Thread thread = new Thread(test, "thread-" + i);
thread.start()
;
mmds}
}
public synchronized void doWrite() {
a++;
try {
sleep((int)(Math.random()*100));
}
catch (InterruptedException e) {
}
b++;
try {
sleep((int)(Math.random()*100));
}
catch (InterruptedException e) {
}
}
public void print() {
System.out.println("" + Thread.currentThread().getName() + ":a:" + a);
System.out.println("" + Thread.currentThread().getName() + ":b:" + b);
}
高考口语成绩查询public void run() {
super.run(); //To change body of overridden methods u File | Settings | File Templates.
for (int i = 0; i < 10; i++) {
doWrite();
print();
}
}
public synchronized void start() {
super.start(); //To change body of overridden methods u File | Settings | File Templates.
}
}
ThreadLocal?ThreadLocal对于线程安全还是很有用的,如果资源不是共享的,那么应该使用ThreadLocal,但如果确实需要在线程间共享资源,ThreadLocal就没有用了!
茨冈人
最后,来一个完整的线程安全的例子:
/**
* $Author: $
* $Date: $
* $Revision: $
* $History: $
*
* Created by feelyou, at time 22:31:53, 2005-11-16.
*/
public class TestThread extends Thread {
private int a = 0; //独立的共享资源
private int b = 0; //b、c互相依赖
private int c = 0;
private volatile long d = 0L; //64位
// private SomeObj obj = new SomeObj(); //对象类型,大家自己写吧,我就不写了。
public static void main(String[] args) {
TestThread test = new TestThread();
for (int i = 0; i < 10; i++) {
Thread thread = new Thread(test, "thread-" + i);
thread.start();
}
}
public synchronized void doWrite() {
b++;
try {
sleep((int)(Math.random()*100));
}
catch (InterruptedException e) {
}
c++;
try {
sleep((int)(Math.random()*100));
}
catch (InterruptedException e) {
}
}
public synchronized void print() {
System.out.println("" + Thread.currentThread().getName() + ":b:" + b);
System.out.println("" + Thread.currentThread().getName() + ":c:" + c);
}
private void tA(int a) {
this.a = a;
}
private int getA() {
return a;
}
public long getD() {
return d;
}
public void tD(long d) {
this.d = d;
}
public void run() {
super.run(); //To change body of overridden methods u File | Settings | File Templates.
for (int i = 0; i < 10; i++) {
doWrite();
print();
tA(i);
System.out.println(getA());
tD(184********L * i);
System.out.println(getD());
}
}
public synchronized void start() {
super.start(); //To change body of overridden methods u File | Settings | File Templates.
}
}