Java多线程机制示例.docx
《Java多线程机制示例.docx》由会员分享,可在线阅读,更多相关《Java多线程机制示例.docx(41页珍藏版)》请在冰豆网上搜索。
Java多线程机制示例
Java多线程机制(示例).txt“恋”是个很强悍的字。
它的上半部取自“变态”的“变”,下半部取自“变态”的“态”。
1Java多线程机制
1.1基本概念
线程控制方法
publicclassThreadimplementsRunnable
{
publicfinalstaticintMIN_PRIORITY;
publicfinalstaticintNORM_PRIORITY;
publicfinalstaticintMAX_PRIORITY;
publicThread();
publicThread(Runnabletarget);
publicThread(ThreadGroupgroup,Runnabletarget);
publicThread(Stringname);
publicThread(ThreadGroupgroup,Stringname);
publicThread(Runnabletarget,Stringname);
publicThread(ThreadGroupgroup,Runnabletarget,Stringname);
publicvoidrun();
publicsynchronizednativevoidstart();
publicfinalvoidstop();
publicfinalsynchronizedvoidstop(Throwableo);
publicstaticnativevoidyield();
publicstaticnativevoidsleep(longmillis)throwsInterruptedException;
publicstaticvoidsleep(longmillis,intnanos)throwsInterruptedException
publicfinalvoidsuspend();
publicfinalvoidresume();
publicfinalsynchronizedvoidjoin(longmillis)throwsInterruptedException;
publicfinalsynchronizedvoidjoin(longmillis,intnanos)throwsInterruptedException;
publicfinalvoidjoin()throwsInterruptedException;
publicvoidinterrupt();
publicstaticbooleaninterrupted();
publicbooleanisInterrupted();
publicvoiddestroy();
publicfinalnativebooleanisAlive();
publicfinalvoidsetPriority(intnewPriority);
publicfinalintgetPriority();
publicfinalvoidsetName(Stringname);
publicfinalStringgetName();
publicfinalThreadGroupgetThreadGroup();
publicstaticnativeThreadcurrentThread();
publicstaticintactiveCount();
publicstaticintenumerate(Threadtarray[]);
publicnativeintcountStackFrames();
publicstaticvoiddumpStack();
publicfinalvoidsetDaemon(booleanon);
publicfinalbooleanisDaemon();
publicvoidcheckAccess();
publicStringtoString();
}
____________________________________________________________
1.2多线程实现方法
例1:
下面程序演示如何用生成Thread子类的方法来创建新线程。
//ThreadTest1.java
publicclassThreadTest1
{
ThreadTest1()
{
FirstThreadfirst=newFirstThread();
SecondThreadsecond=newSecondThread();
first.start();
second.start();
}
publicstaticvoidmain(String[]args)
{
newThreadTest1();
}
}
classFirstThreadextendsThread
{
publicvoidrun()
{
try
{
System.out.println("Firstthreadstartsrunning.");
for(inti=0;i<10;i++)
{
System.out.println("First"+i);
sleep(1000);
}
System.out.println("Firstthreadfinishesrunning.");
}
catch(InterruptedExceptione){}
}
}
classSecondThreadextendsThread
{
publicvoidrun()
{
try
{
System.out.println("\tSecondthreadstartsrunning.");
for(inti=0;i<10;i++)
{
System.out.println("\tSecond"+i);
sleep(1000);
}
System.out.println("\tSecondthreadfinishesrunning.");
}
catch(InterruptedExceptione){}
}
}
程序设计了两个线程FirstThread类和SecondThread类,它们都是Thread类的子类覆盖了run()方法,在其中分别进行打印数值的工作。
除了这两个线程外,还有一个线程在执行,就是启动类线程,称它为主线程,它负责生成另外两个线程,再用start()方法启动这两个线程。
线程first和second启动后,并发执行。
观察执行结果会发现两个线程交替打印数据,而不是一个线程完成了所有打印工作后,另一个线程才开始打印工作,这就是多线程的本质。
提示:
线程在调用Thread类方法sleep()睡眠时,有可能产生异常,要求应用程序用try-catch捕获这个异常,如果不用try-catch,程序将出错。
某次的运行结果:
Firstthreadfinishesrunning.
First0
Secondthreadstartsrunning.
Second0
Second1
First1
First2
Second2
First3
Second3
First4
Second4
Second5
First5
First6
Second6
First7
Second7
First8
Second8
First9
Second9
Firstthreadfinishesrunning.
Secondthreadfinishes
________________________________________________
例2:
下面程序演示如何用生成Thread子类的方法来创建新线程。
//ThreadTest2.java
publicclassThreadTest2
{
ThreadTest2()
{
FirstThreadfirst=newFirstThread();
SecondThreadsecond=newSecondThread();
first.start();
second.start();
try
{
first.join();
System.out.println("Waitingforfirstthreadtofinish...");
System.out.println("Wakingupsecondthread...");
second.resume();
}
catch(InterruptedExceptione){}
}
publicstaticvoidmain(String[]args)
{
newThreadTest2();
}
}
classFirstThreadextendsThread
{
publicvoidrun()
{
try
{
System.out.println("FirstthreadSTARTSrunning.");
for(inti=0;i<10;i++)
{
System.out.println("First"+i);
sleep(1000);
}
System.out.println("FirstthreadFINISHESrunning.");
}
catch(InterruptedExceptione){}
}
}
classSecondThreadextendsThread
{
publicvoidrun()
{
try
{
System.out.println("\tSecondthreadSTARTSrunning.");
for(inti=0;i<10;i++)
{
if(i==4)
suspend();
System.out.println("\tSecond"+i);
sleep(1000);
}
System.out.println("\tSecondthreadFINISHESrunning.");
}
catch(InterruptedExceptione){}
}
}
程序仍然使用两个线程打印数据,不同的是second线程在打印数据过程中,发现是数值4,则调用suspend()方法,暂停本身的执行。
主线程用join()方法等线程first执行结束后,用resume()方法来唤醒second线程,second线程被唤醒后,将继续完成打印工作。
提示:
join()也将出现InterruptedException异常,所以必须捕获异常。
某次的运行结果:
FirstthreadSTARTSrunning.
First0
SecondthreadSTARTSrunning.
Second0
First1
Second1
First2
Second2
First3
Second3
First4
First5
First6
First7
First8
First9
FirstthreadFINISHESrunning.
Waitingforfirstthreadtofinish...
Wakingupsecondthread...
Second4
Second5
Second6
Second7
Second8
Second9
SecondFINISHESfinishes
____________________________________________________________
例3:
下面的程序说明如何用接口来创建线程。
//RunTest.java
publicclassRunTest
{
RunTest()
{
FirstThreadfirst=newFirstThread();
SecondThreadsecond=newSecondThread();
Threadthread1=newThread(first);
Threadthread2=newThread(second);
thread1.start();
thread2.start();
}
publicstaticvoidmain(String[]args)
{
newRunTest();
}
}
classFirstThreadimplementsRunnable
{
publicvoidrun()
{
try
{
System.out.println("Firstthreadstartsrunning.");
for(inti=0;i<10;i++)
{
System.out.println("First"+i);
Thread.sleep(1000);
}
System.out.println("Firstthreadfinishesrunning.");
}
catch(InterruptedExceptione){}
}
}
classSecondThreadimplementsRunnable
{
publicvoidrun()
{
try
{
System.out.println("\tSecondthreadstartsrunning.");
for(inti=0;i<10;i++)
{
System.out.println("\tSecond"+i);
Thread.sleep(1000);
}
System.out.println("\tSecondthreadfinishesrunning.");
}
catch(InterruptedExceptione){}
}
}
这个程序与ThreadTest1.java有相同的功能,只不过现在用实现Runnable接口的方法来创建和执行线程。
______________________________________________
_____________________________________________
2输入输出流类
2.1文件系统
1.文件路径和属性
例子:
下面的程序首先判断给定文件是否存在,如果存在则显示文件路径、绝对路径等,然后再查询文件的属性。
//FileTest1.java
importjava.io.*;
classFileTest1
{
publicstaticvoidmain(String[]args)
{
Stringpath;
if(args.length!
=1)
{
System.err.println("Usage:
javaFileTest1FileorDir");
System.exit(-1);
}
Filef=newFile(args[0]);
if(f.exists())
{
System.out.println("-----------------------------");
System.out.println("AbsolutePath:
"+f.getAbsolutePath());
System.out.println("FilePath:
"+f.getPath());
System.out.println("FileName:
"+f.getName());
System.out.println("ParentDirtory:
"+f.getParent());
System.out.println("-----------------------------");
StringcanRead=f.canRead()?
"Yes":
"No";
StringcanWrite=f.canWrite()?
"Yes":
"No";
StringisFile=f.isFile()?
"Yes":
"No";
StringisDir=f.isDirectory()?
"Yes":
"No";
StringisAbs=f.isAbsolute()?
"Yes":
"No";
System.out.println("Readable:
"+canRead);
System.out.println("Writable:
"+canWrite);
System.out.println("Isdirectoty:
"+isDir);
System.out.println("Isfile:
"+isFile);
System.out.println("Isabsolutepath:
"+isAbs);
}
elseSystem.out.println("Cannotfoundfile:
"+args[0]);
}
}
这是一个Application程序,用命令行参数接受输入文件名。
读者可以用不同的命令行参数来执行上面的程序,体会上述方法的区别。
运行:
javaFileTest1d:
\java\filetest1
运行结果:
-----------------------------
AbsolutePath:
d:
\java\filetest1
FilePath:
d:
\java\filetest1
FileName:
filetest1
ParentDirtory:
d:
\java
-----------------------------
Readable:
Yes
Writable:
Yes
Isdirectoty:
Yes
Isfile:
No
Isabsolutepath:
Yes
—————
运行:
javaFileTest1\java\filetest1
运行结果:
-----------------------------
AbsolutePath:
d:
\java\filetest1
FilePath:
\java\filetest1
FileName:
filetest1
ParentDirtory:
\java
-----------------------------
Readable:
Yes
Writable:
Yes
Isdirectoty:
Yes
Isfile:
No
Isabsolutepath:
No
—————
运行:
javaFileTest1\java\filetest1\filetest1.java
运行结果:
-----------------------------
AbsolutePath:
d:
\java\filetest1\filetest1.java
FilePath:
\java\filetest1\filetest1.java
FileName:
filetest1.java
ParentDirtory:
\java\filetest1
-----------------------------
Readable:
Yes
Writable:
Yes
Isdirectoty:
No
Isfile:
Yes
Isabsolutepath:
No
—————
运行:
javaFileTest1\java
运行结果:
-----------------------------
AbsolutePath:
d:
\java
FilePath:
\java
FileName:
java
ParentDirtory:
\
-----------------------------
Readable:
Yes
Writable:
Yes
Isdirectoty:
Yes
Isfile:
No
Isabsolutepath:
No
—————
运行:
javaFileTest1\java
运行结果:
-----------------------------
AbsolutePath:
d:
\
FilePath:
\
FileName:
ParentDirtory:
null
-----------------------------
Readable:
Yes
Writable:
Yes
Isdirectoty:
Yes
Isfile:
No
Isabsolutepath:
No
————————————————————————————
————————————————————————————
2.创建目录和删除文件
例2:
//FileTest2.java
importjava.io.*;
classFileTest2
{
publicstaticvoidmain(String[]args)
{
Filedir,subdir;
if(args.length!
=1)
{
System.err.println("Usage:
javaFileTest2");
System.exit(-1);
}
dir=newFile(args[0]);
if(dir.exists())
System.out.println(dir.getPath()+"alreadyexist!
");
else
{
if(dir.mkdirs())//说明区别
{
System.out.println("Createddirectory:
"+dir.getAbsolutePath