??xml version="1.0" encoding="utf-8" standalone="yes"?>
W一U方法:(x)
需下蝲 jna.jar
a)
创徏
Kernel32
接口
b) 修改旉
W二U方?/span>
Linuxpȝ修改旉
String os
=
System.getProperty(
"
os.name
"
).toLowerCase();
//
获取操作pȝ名称
if
(os.indexOf(
"
windows
"
)
!=
-
1
)
{
cmd
=
"
cmd /c time
"
+
timeStr;
ProcessUtil.printErr(Runtime.getRuntime().exec(cmd));
cmd
=
"
cmd /c date
"
+
timeStr;
ProcessUtil.printErr(Runtime.getRuntime().exec(cmd));
}
else
{
cmd
=
"
date
"
+
timeStr; //timeStr旉到分Q先写时间再写日?br />
ProcessUtil.printErr(Runtime.getRuntime().exec(cmd));
}
public class ProcessUtil {
public static void printErr(Process p) {
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(p.getErrorStream()));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (br != null)
br.close();
} catch (Exception e) {
e.printStackTrace();
}
p.destroy();
}
}
public static void printConsole(Process p) {
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (br != null)
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static String getErrInfo(Process p) {
StringBuffer sb = new StringBuffer();
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(p.getErrorStream()));
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line).append("\n");
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (br != null)
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
}
??Z解决对共享存储区的访问冲H,Java 引入了同步机Ӟ现在让我们来考察多个U程对共享资源的讉KQ显然同步机制已l不够了Q因为在L时刻所要求的资源不一定已l准备好了被讉KQ反q来Q同一时刻准备好了的资源也可能不止一个。ؓ(f)了解册U情况下的访问控刉题,Java 引入了对d机制的支持?
??d指的是暂停一个线E的执行以等待某个条件发生(如某资源qAQ,学过操作pȝ的同学对它一定已l很熟?zhn)了。Java 提供了大量方法来支持dQ下面让我们逐一分析?
1. sleep() Ҏ(gu)Qsleep() 允许 指定以毫Uؓ(f)单位的一D|间作为参敎ͼ它得线E在指定的时间内q入d状态,不能得到CPU 旉Q指定的旉一q,U程重新q入可执行状态?
典型圎ͼsleep() 被用在等待某个资源就l的情ŞQ测试发现条件不满后,让线E阻塞一D|间后重新试Q直到条件满ؓ(f)止?
2. suspend() ?resume() Ҏ(gu)Q两个方法配套用,suspend()使得U程q入d状态,q且不会(x)自动恢复Q必d对应的resume() 被调用,才能使得U程重新q入可执行状态。典型地Qsuspend() ?resume() 被用在等待另一个线E生的l果的情形:(x)试发现l果q没有生后Q让U程dQ另一个线E生了l果后,调用 resume() 使其恢复?
3. yield() Ҏ(gu)Qyield() 使得U程攑ּ当前分得?CPU 旉Q但是不使线E阻塞,即线E仍处于可执行状态,随时可能再次分得 CPU 旉。调?yield() 的效果等价于调度E序认ؓ(f)该线E已执行了够的旉从而{到另一个线E?
4. wait() ?notify() Ҏ(gu)Q两个方法配套用,wait() 使得U程q入d状态,它有两种形式Q一U允?指定以毫Uؓ(f)单位的一D|间作为参敎ͼ另一U没有参敎ͼ前者当对应?notify() 被调用或者超出指定时间时U程重新q入可执行状态,后者则必须对应?notify() 被调用?
??初看h它们?suspend() ?resume() Ҏ(gu)Ҏ(gu)有什么分别,但是事实上它们是截然不同的。区别的核心在于Q前面叙q的所有方法,d旉不会(x)释放占用的锁Q如果占用了的话Q,而这一Ҏ(gu)法则相反?
上述的核心区别导致了一pd的细节上的区别?
??首先Q前面叙q的所有方法都隶属?Thread c,但是q一对却直接隶属?Object c,也就是说Q所有对象都拥有q一Ҏ(gu)法。初看v来这十分不可思议Q但是实际上却是很自然的Q因一Ҏ(gu)法阻塞时要释攑֍用的锁,而锁是Q何对象都h的,调用L对象?wait() Ҏ(gu)DU程dQƈ且该对象上的锁被释放。而调?L对象的notify()Ҏ(gu)则导致因调用该对象的 wait() Ҏ(gu)而阻塞的U程中随机选择的一个解除阻塞(但要{到获得锁后才真正可执行Q?
??其次Q前面叙q的所有方法都可在M位置调用Q但是这一Ҏ(gu)法却必须?synchronized Ҏ(gu)或块中调用,理由也很单,只有在synchronized Ҏ(gu)或块中当前线E才占有锁,才有锁可以释放。同L(fng)道理Q调用这一Ҏ(gu)法的对象上的锁必Mؓ(f)当前U程所拥有Q这h有锁可以释放。因此,q一Ҏ(gu)法调用必L|在q样?synchronized Ҏ(gu)或块中,该方法或块的上锁对象是调用q一Ҏ(gu)法的对象。若不满一条gQ则E序虽然仍能~译Q但在运行时?x)出现IllegalMonitorStateException 异常?
??wait() ?notify() Ҏ(gu)的上q特性决定了它们l常和synchronized Ҏ(gu)或块一起用,它们和操作pȝ的进E间通信机制作一个比较就?x)发现它们的怼性:(x)synchronizedҎ(gu)或块提供了类g操作pȝ原语的功能,它们的执行不?x)受到多U程机制的干扎ͼ而这一Ҏ(gu)法则相当?block 和wakeup 原语Q这一Ҏ(gu)法均声明?synchronizedQ。它们的l合使得我们可以实现操作pȝ上一pd_֦的进E间通信的算法(如信号量法Q,q用于解军_U复杂的U程间通信问题?
关于 wait() ?notify() Ҏ(gu)最后再说明两点Q?
??W一Q调?notify() Ҏ(gu)D解除d的线E是从因调用该对象的 wait() Ҏ(gu)而阻塞的U程中随机选取的,我们无法预料哪一个线E将?x)被选择Q所以编E时要特别小心,避免因这U不定性而生问题?
??W二Q除?notify()Q还有一个方?notifyAll() 也可起到cM作用Q唯一的区别在于,调用 notifyAll() Ҏ(gu)把因调用该对象?wait() Ҏ(gu)而阻塞的所有线E一ơ性全部解除阻塞。当Ӟ只有获得锁的那一个线E才能进入可执行状态?
??谈到dQ就不能不谈一谈死锁,略一分析p发现Qsuspend() Ҏ(gu)和不指定时期限?wait() Ҏ(gu)的调用都可能产生死锁。遗憄是,Java q不在语aU别上支持死锁的避免Q我们在~程中必d心地避免死锁?
??以上我们?Java 中实现线E阻塞的各种Ҏ(gu)作了一番分析,我们重点分析?wait() ?notify() Ҏ(gu)Q因为它们的功能最强大Q用也最灉|Q但是这也导致了它们的效率较低,较容易出错。实际用中我们应该灉|使用各种Ҏ(gu)Q以便更好地辑ֈ我们的目的?
七:(x)守护U程
??守护U程是一cȝD的U程Q它和普通线E的区别在于它ƈ不是应用E序的核心部分,当一个应用程序的所有非守护U程l止q行Ӟ即仍然有守护线E在q行Q应用程序也终止,反之Q只要有一个非守护U程在运行,应用E序׃?x)终止。守护线E一般被用于在后Cؓ(f)其它U程提供服务?
可以通过调用Ҏ(gu) isDaemon() 来判断一个线E是否是守护U程Q也可以调用Ҏ(gu) setDaemon() 来将一个线E设为守护线E?
八:(x)U程l?
??U程l是一?Java Ҏ(gu)的概念,?Java 中,U程l是cThreadGroup 的对象,每个U程都隶属于唯一一个线E组Q这个线E组在线E创建时指定q在U程的整个生命期内都不能更改。你可以通过调用包含 ThreadGroup cd参数?Thread cL造函数来指定U程属的U程l,若没有指定,则线E缺省地隶属于名?system 的系l线E组?
???Java 中,除了预徏的系l线E组外,所有线E组都必L式创建。在 Java 中,除系l线E组外的每个U程l又隶属于另一个线E组Q你可以在创建线E组时指定其所隶属的线E组Q若没有指定Q则~省地隶属于pȝU程l。这P所有线E组l成了一以pȝU程lؓ(f)根的?wi)?
??Java 允许我们对一个线E组中的所有线E同时进行操作,比如我们可以通过调用U程l的相应Ҏ(gu)来设|其中所有线E的优先U,也可以启动或d其中的所有线E?
Java 的线E组机制的另一个重要作用是U程安全。线E组机制允许我们通过分组来区分有不同安全Ҏ(gu)的U程Q对不同l的U程q行不同的处理,q可以通过U程l的分层l构来支持不对等安全措施的采用。Java ?ThreadGroup cL供了大量的方法来方便我们对线E组?wi)中的每一个线E组以及(qing)U程l中的每一个线E进行操作?
?ji)?x)ȝ
??在本文中Q我们讲qC Java 多线E编E的Ҏ(gu)面面Q包括创建线E,以及(qing)对多个线E进行调度、管理。我们深刻认识到了多U程~程的复杂性,以及(qing)U程切换开销带来的多U程E序的低效性,q也促我们认真地思考一个问题:(x)我们是否需要多U程Q何旉要多U程Q?
??多线E的核心在于多个代码块ƈ发执行,本质特点在于各代码块之间的代码是乱序执行的。我们的E序是否需要多U程Q就是要看这是否也是它的内在特点?
??假如我们的程序根本不要求多个代码块ƈ发执行,那自然不需要用多U程Q假如我们的E序虽然要求多个代码块ƈ发执行,但是却不要求乱序Q则我们完全可以用一个@环来单高效地实现Q也不需要用多U程Q只有当它完全符合多U程的特Ҏ(gu)Q多U程机制对线E间通信和线E管理的强大支持才能有用武之圎ͼq时使用多线E才是值得的?br />
转自Q?a >http://ssby.blogdriver.com/ssby/