/*
下面的程序说明了怎样实现对象序列化和反序列化。它由实例化一个MyClasscȝ对象开始。该对象有三个实例变量,它们的类型分别是StringQint和double。这是我们希望存储和恢复的信息?/p>
*/
imp
class MyClass implements Serializable{
String s;
int i;
double d;
public MyClass (String s,int i,double d){
this.s = s;
this.i = i;
this.d = d;
}
public String toString(){
return "s=" + s + "; i=" + i + "; d=" + d;
}
}
class SerializationDemo{
public static void main(String[] args){
//Object serialization.
try{
MyClass object1 = new MyClass("Evan",9,9.9e10);
System.out.println("object1 : " +object1);
FileOutputStream fos = new FileOutputStream("serial");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(object1);
oos.flush();
oos.close();
}catch(Exception e){
System.out.println("Exception during serialization :" + e);
System.exit(0);
}
//Object deserialization.
try{
MyClass object2 ;
FileInputStream fis = new FileInputStream("serial");
ObjectInputStream ois = new ObjectInputStream(fis);
object2 = (MyClass)ois.readObject();
ois.close();
System.out.println("object2 : " +object2);
}catch(Exception e){
System.out.println("Exception during serialization :" + e);
System.exit(0);
}
}
}
匚w中文字符的正则表辑ּQ?[\u4e00-\u9fa5]
匚w双字节字W?包括汉字在内)Q?[^\x00-\xff]
应用Q计字W串的长度(一个双字节字符长度?QASCII字符?Q?br>String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}
匚wI的正则表辑ּQ?\n[\s| ]*\r
匚wHTML标记的正则表辑ּQ?/<(.*)>.*<\/>|<(.*) \/>/
匚w首尾I格的正则表辑ּQ?(^\s*)|(\s*$)
应用Qjavas
String.prototype.trim = function() {
return this.replace(/(^\s*)|(\s*$)/g, "");
}
利用正则表达式分解和转换IP地址Q?br>下面是利用正则表辑ּ匚wIP地址QƈIP地址转换成对应数值的javas
function IP2V(ip) {
re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匚wIP地址的正则表辑ּ
if(re.test(ip)) {
return RegExp.*Math.pow(255,3))+RegExp.*Math.pow(255,2))+RegExp.*255+RegExp.*1
}
else {
throw new Error("Not a valid IP address!")
}
}
不过上面的程序如果不用正则表辑ּQ而直接用split函数来分解可能更单,E序如下Q?br>
var ip="10.100.20.168"
ip=ip.split(".")
alert("IP值是Q?+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))
匚wEmail地址的正则表辑ּQ?\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匚w|址URL的正则表辑ּQ?http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
利用正则表达式去除字串中重复的字W的法E序Q?br>
var s="abacabefgeeii"
var s1=s.replace(/(.).*/g,"")
var re=new RegExp("["+s1+"]","g")
var s2=s.replace(re,"")
alert(s1+s2) //l果为:(x)abcefgi
用正则表辑ּ从URL地址中提取文件名的javas
s="http://www.9499.net/page1.htm"
s=s.replace(/(.*\/)([^\.]+).*/ig,"")
alert(s)
利用正则表达式限制网表单里的文本框输入内容Q?br>
用正则表辑ּ限制只能输入中文Q?br>on
用正则表辑ּ限制只能输入全角字符Q?br>on
用正则表辑ּ限制只能输入数字Q?br>on
用正则表辑ּ限制只能输入数字和英文:(x)
on
q是用patternset来定义DirSet的模式,q个模式q可以在外部引用。如Q?br>
上面定义了一个名为non.test.classes的PatternSetQ现在就可以引用他了。refid即reference ID.
3.FileSetx仉合,他的内部属性与DirSet几乎一P只是多了一个file和defaultexcludes。和dirset一Pl常
嵌入patternset来定义文仉合;但是也有另外一个很常用的类型,叫selectorQ它q不是一个真正的cd或元素,只是一U、一cȝ型的l?
U。如contains、date、depend、depth、different、filename、present、containsregexp?
size、type{?/p>
文章来源:http://blog.163.com/ccbobo_cat/blog/static/3209946220096105521217
一、什么是条g变量
与互斥锁不同Q条件变量是用来{待而不是用来上锁的。条件变量用来自动阻塞一个线E,直到某特D情况发生ؓ(f)止。通常条g变量和互斥锁同时使用?/span>
条g变量使我们可以睡眠等待某U条件出现。条件变量是利用U程间共享的全局变量q行同步的一U机Ӟ主要包括两个动作Q一个线E等?/span>"条g变量的条件成?/span>"而挂P另一个线E"条g成立"Q给出条件成立信P?/span>
? 件的是在互斥锁的保护下q行的。如果一个条件ؓ(f)假,一个线E自动阻塞,q攄待状态改变的互斥锁。如果另一个线E改变了条gQ它发信L(fng)兌的条? 变量Q唤醒一个或多个{待它的U程Q重新获得互斥锁Q重新评h件。如果两q程׃n可读写的内存Q条件变量可以被用来实现q两q程间的U程同步?/font>
使用条g变量之前要先q行初始化。可以在单个语句中生成和初始化一个条件变量如Q?/span>
pthread_cond_t my_condition=PTHREAD_COND_INITIALIZER;Q用于进E间U程的通信Q?/span>
也可以利用函?/span>pthread_cond_init动态初始化?/span>
二、条件变量函?/span>
1Q?/span>
名称Q?/font> |
pthread_cond_init |
目标Q?/span> |
条g变量初始?/font> |
头文Ӟ(x) |
#include < pthread.h> |
函数原ŞQ?/font> |
int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr); |
参数: |
cptr 条g变量 attr 条g变量属?/span> |
q回|(x) |
成功q回0Q出错返回错误编受?/span> |
pthread_cond_init函数可以用来初始化一个条件变量。他使用变量attr所指定的属性来初始化一个条件变量,如果参数attr为空Q那么它?yu)用缺省的属性来讄所指定的条件变量?/span>
2.
名称Q?/font> |
pthread_cond_destroy |
目标Q?/span> |
条g变量摧毁 |
头文Ӟ(x) |
#include < pthread.h> |
函数原ŞQ?/font> |
int pthread_cond_destroy(pthread_cond_t *cond); |
参数: |
cptr 条g变量 |
q回|(x) |
成功q回0Q出错返回错误编受?/span> |
pthread_cond_destroy函数可以用来摧毁所指定的条件变量,同时会(x)释放所l它分配的资源。调用该函数的进E也q不要求{待在参数所指定的条件变量上?/span>
3.
名称Q?/font> |
pthread_cond_wait/pthread_cond_timedwait |
目标Q?/span> |
条g变量{待 |
头文Ӟ(x) |
#include < pthread.h> |
函数原ŞQ?/font> |
int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex); int pthread_cond_timedwait(pthread_cond_t *cond,pthread_mutex_t mytex,const struct timespec *abstime); |
参数: |
cond 条g变量 mutex 互斥?/span> |
q回|(x) |
成功q回0Q出错返回错误编受?/span> |
W一个参?/span>*cond是指向一个条件变量的指针。第二个参数*mutex则是对相关的互斥锁的指针。函?/span>pthread_cond_timedwait函数cd与函?/span>pthread_cond_wait,区别在于Q如果达到或是超q所引用的参?/span>*abstime,它将l束q返回错?/span>ETIME.pthread_cond_timedwait函数的参?/span>*abstime指向一?/span>timespecl构。该l构如下Q?/span>
typedef struct timespec{
time_t tv_sec;
long tv_nsex;
}timespec_t;
3.
名称Q?/font> |
pthread_cond_signal/pthread_cond_broadcast |
目标Q?/span> |
条g变量通知 |
头文Ӟ(x) |
#include < pthread.h> |
函数原ŞQ?/font> |
int pthread_cond_signal(pthread_cond_t *cond); int pthread_cond_broadcast(pthread_cond_t *cond); |
参数: |
cond 条g变量 |
q回|(x) |
成功q回0Q出错返回错误编受?/span> |
参数*cond是对cd?/span>pthread_cond_t 的一个条件变量的指针。当调用pthread_cond_signal时一个在相同条g变量上阻塞的U程被解锁。如果同时有多个U程dQ则p度策略确定接攉知的线E。如果调?/span>pthread_cond_broadcast,则将通知d在这个条件变量上的所有线E。一旦被唤醒Q线E仍然会(x)要求互斥锁。如果当前没有线E等待通知Q则上面两种调用实际上成Z个空操作。如果参?/span>*cond指向非法地址Q则q回?/span>EINVAL?/span>
下面是一个简单的例子Q我们可以从E序的运行来了解条g变量的作用?/font>
#include <pthread.h> sleep(1); } if(i%3!=0) sleep(1); } |
E序创徏?/span>2个新U程使他们同步运行,实现q程t_b打印20以内3的倍数Q?/span>t_a打印其他的数Q程序开始线E?/span>t_b不满x件等待,U程t_aq行?/span>a循环?/span>1q打印。直?/span>i?/span>3的倍数ӞU程t_a发送信号通知q程t_bQ这?/span>t_b满条gQ打?/span>i倹{?/span>
下面是运行结果:(x)
#cc –lpthread –o cond cond.c
#./cond
thread1:1
thread1:2
thread2:3
thread1:4
thread1:5
thread2:6
thread1:7
thread1:8
thread2:9