Java多线程机制示例.docx

上传人:b****6 文档编号:6451024 上传时间:2023-01-06 格式:DOCX 页数:41 大小:24.52KB
下载 相关 举报
Java多线程机制示例.docx_第1页
第1页 / 共41页
Java多线程机制示例.docx_第2页
第2页 / 共41页
Java多线程机制示例.docx_第3页
第3页 / 共41页
Java多线程机制示例.docx_第4页
第4页 / 共41页
Java多线程机制示例.docx_第5页
第5页 / 共41页
点击查看更多>>
下载资源
资源描述

Java多线程机制示例.docx

《Java多线程机制示例.docx》由会员分享,可在线阅读,更多相关《Java多线程机制示例.docx(41页珍藏版)》请在冰豆网上搜索。

Java多线程机制示例.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1