网络编程技术第三次课多线程代码.docx

上传人:b****3 文档编号:4310823 上传时间:2022-11-29 格式:DOCX 页数:13 大小:19.67KB
下载 相关 举报
网络编程技术第三次课多线程代码.docx_第1页
第1页 / 共13页
网络编程技术第三次课多线程代码.docx_第2页
第2页 / 共13页
网络编程技术第三次课多线程代码.docx_第3页
第3页 / 共13页
网络编程技术第三次课多线程代码.docx_第4页
第4页 / 共13页
网络编程技术第三次课多线程代码.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

网络编程技术第三次课多线程代码.docx

《网络编程技术第三次课多线程代码.docx》由会员分享,可在线阅读,更多相关《网络编程技术第三次课多线程代码.docx(13页珍藏版)》请在冰豆网上搜索。

网络编程技术第三次课多线程代码.docx

网络编程技术第三次课多线程代码

1)第一个程序:

LeftAndRight.java

publicclassLeftAndRight{

publicstaticvoidmain(Stringargs[]){

Lefthandleft;//声明线程类对象

Righthandright;

left=newLefthand();//新建线程。

right=newRighthand();

left.start();//线程开始运行后,Lefthand类中的run方法将被执行。

right.start();

for(inti=0;i<=6;i++){

System.out.println("我是主线程");

}

}

}

classLefthandextendsThread{

publicvoidrun(){

for(inti=1;i<=9;i++){

System.out.println("我是左手线程");

try{//线程执行一次输出后,休眠500ms(毫秒),使自己放弃CPU资源,

//500ms时间到后,重新排队等待CPU的调度

sleep(500);

}catch(InterruptedExceptione){

//如果线程在休眠期被打断,将抛出InterruptedException,

//所以sleep方法需要在try……catch语句块中被调用

}

}

}

}

classRighthandextendsThread{

publicvoidrun(){

for(inti=1;i<=5;i++){

System.out.println("我是右手线程");

try{

sleep(300);

}catch(InterruptedExceptione){

}

}

}

}

2)第二个程序:

StudentAndTeacher.java

publicclassStudentAndTeacher{

/**

*两个线程共享一个对象ComputerSumsum,在运行的过程中修改这个对象的成员变量sum。

*为了使结果尽量不依赖于当前CPU资源的使用情况,应当让线程主动调用sleep方法,让出CPU的控制权进入中断状态

*/

publicstaticvoidmain(String[]args){

//TODOAuto-generatedmethodstub

ComputerSumsum=newComputerSum();

Peopleteacher=newPeople("教师",100,sum);

Peoplestudent=newPeople("学生",100,sum);

teacher.start();

student.start();

}

}

classComputerSum{

//线程共享的对象类ComputerSum,其中定义了一个数据成员sum

intsum=0;

publicvoidsetSum(intn){

sum=n;

}

publicintgetSum(){

returnsum;

}

}

classPeopleextendsThread{

//类People是Thread的子类

ComputerSumcomputerSum;

inttimeLength;

People(Strings,inttimeLength,ComputerSumsum){//构造方法

setName(s);//设置Thread的名称

this.timeLength=timeLength;//设置休眠时间

puterSum=sum;//设置ComputerSum类的对象sum

}

publicvoidrun(){//重写Thread父类的run()方法

for(inti=1;i<=5;i++){

intm=computerSum.getSum();//取出computerSum对象中的数据成员sum

computerSum.setSum(m+1);//将数据成员sum的值加1

System.out.println("我是"+getName()+",现在的和是"+computerSum.getSum());

//输出当前处于运行中的线程的信息

try{

sleep(timeLength);//线程休眠timeLength毫秒

}catch(InterruptedExceptione){

}

}

}

}

3)第三个程序:

StudentAndTeacher1.java

publicclassStudentAndTeacher1{

/**

*StudentAndTeacher1为StudentAndTeacher的改进版本

*/

publicstaticvoidmain(String[]args){

//TODOAuto-generatedmethodstub

ComputerSumsum=newComputerSum();

People1people=newPeople1(200,sum);

people.teacher.start();

people.student.start();

}

}

classComputerSum1{

//线程共享的对象类ComputerSum,其中定义了一个数据成员sum

intsum=0;

publicvoidsetSum(intn){

sum=n;

}

publicintgetSum(){

returnsum;

}

}

classPeople1implementsRunnable{

//类People是Thread的子类

ComputerSumcomputerSum;

inttimeLength;

Threadteacher,student;

People1(inttimeLength,ComputerSumsum){//构造方法

teacher=newThread(this);//类People1实现了接口Runnable

teacher.setName("教师");

student=newThread(this);

student.setName("学生");

this.timeLength=timeLength;//设置休眠时间

puterSum=sum;//设置ComputerSum类的对象sum

}

publicsynchronizedvoidcomputer(Threadthread){

intm=computerSum.getSum();//取出computerSum对象中的数据成员sum

computerSum.setSum(m+1);//将数据成员sum的值加1

System.out.println("我是"+thread.getName()+",现在的和是"

+computerSum.getSum());

}

publicvoidrun(){//重写Thread父类的run()方法

for(inti=1;i<=5;i++){

if(Thread.currentThread()==teacher){

computer(teacher);

}elseif(Thread.currentThread()==student){

computer(student);

}

try{

Thread.sleep(timeLength);//线程休眠timeLength毫秒

}catch(InterruptedExceptione){

}

}

}

}

4)第四个程序:

GuessNumberGame.java

/*猜数程序

第一个线程givenNumberThread负责随机给出1-100之间的一个整数

第二个线程guessNumberThread负责猜出这个数

每当第二个线程给出自己的猜测后

第一个线程会将其比较后,提示“猜大了”,“猜小了”,“猜对了”*/

publicclassGuessNumberGame{

publicstaticvoidmain(String[]args){

GuessNumbergn=newGuessNumber();

gn.givenNumberThread.start();//启动线程

gn.guessNumberThread.start();

}

}

classGuessNumberimplementsRunnable{

intrealNumber,guessNumber,min=0,max=100,message;

//realNumber:

随机数;guessNumber:

某次猜得的数;message:

提示信息

finalintSMALLER=-1,LARGER=1,SUCCESS=8;

ThreadguessNumberThread,givenNumberThread;

//guessNumberThread:

线程,给出随机整数并判定线程givenNumberThread猜得的数字是否正确

GuessNumber(){

guessNumberThread=newThread(this);

givenNumberThread=newThread(this);

}

publicvoidrun(){

for(inti=1;true;i++){

if(Thread.currentThread()==givenNumberThread){

//如果当前正在运行的线程是givenNumberThread

if(i==1){//givenNumberThread线程第一次运行时,给出一个随机数

realNumber=(int)(Math.random()*100)+1;

System.out.println("给你一个随机数,猜猜是多少?

realNumber="+realNumber);

}else{

/*比较guessNumber和realNumber的大小,

并向猜数线程guessNumberThread传递猜大了或猜小了等信息*/

if(guessNumber>realNumber){//猜得的数偏大

message=LARGER;

System.out.println("您猜的数偏大");

}elseif(guessNumber

message=SMALLER;

System.out.println("您猜的数偏小");

}elseif(guessNumber==realNumber){

//猜对了,guessNumber==realNumber

message=SUCCESS;

System.out.println("恭喜,您猜对了!

");

return;//猜对了,givenNumberThread运行结束,返回

}

}//else

try{

Thread.sleep(1500);//休眠1000毫秒,让出CPU资源给其他线程

}catch(InterruptedExceptione){

}

}//if

if(Thread.currentThread()==guessNumberThread){

//如果当前正在运行的线程是guessNumberThread

if(i==1){

/*guessNumberThread线程第一次运行时,

guessNumber=(min+max)/2=(0+100)/2=50

后面guessNumberThread采用“折半”查找的原理

根据每次从guessNumberThread那里得到的提示信息,

修改max或min的值,给出新的guessNumber的取值*/

guessNumber=(min+max)/2;

System.out.println("我猜这个数是"+guessNumber);

}else{

if(message==SMALLER){

min=guessNumber;

guessNumber=(min+max)/2;

System.out.println("我猜这个数是"+guessNumber);

}elseif(message==LARGER){

max=guessNumber;

guessNumber=(min+max)/2;

System.out.println("我猜这个数是"+guessNumber);

}elseif(message==SUCCESS){

//根据message得知猜对了,guessNumberThread运行结束,返回

System.out.println("我成功了!

");

return;

}

}//else

try{

Thread.sleep(1500);//休眠1000毫秒,让出CPU资源给其他线程

}catch(InterruptedExceptione){

}

}//if

}

}

}

5)第五个程序GuessNumberGame1.java

……代码略……。

6)第六个程序ScrollWordsAndTimer.java

/**

*本例中是一个带滚动字幕的小时钟,在文本框中显示系统当前时间,

*滚动的字幕在单击“加速”键后,会加速字幕的滚动速度;单击“停止“后,会停止滚动

*单击”开始“后,文字会重新开始滚动

*/

publicclassScrollWordsAndTimer{

publicstaticvoidmain(String[]args){

newSrollingAndTimerFrame();

}

}

classSrollingAndTimerFrameextendsJFrameimplementsRunnable,ActionListener{

JButtonfastWordsBtn,stopWordsBtn,startWordsBtn,startTimerBtn,

stopTimerBtn;//加速滚动文字,停止滚动文字,(重新)开始滚动文字,开始显示时间,停止显示时间

JLabellabelOfScrollWords,labelOfBlank,labelOfTimer;

ThreadscrollWordsThread,timerThread;//滚动文字线程,显示时钟线程

//JTextAreatextOfTime;

JTextFieldtextOfTime;//显示时钟的文本框

booleanstopScrolling,stopTimer;//是否停止滚动标志位,是否停止显示系统时间标志位

SrollingAndTimerFrame(){

setTitle("一个带滚动字幕的小字典");

setLayout(newFlowLayout());

fastWordsBtn=newJButton("加速滚动");

startWordsBtn=newJButton("开始滚动");

startWordsBtn.setEnabled(false);

stopWordsBtn=newJButton("停止滚动");

startTimerBtn=newJButton("开始显示时间");

stopTimerBtn=newJButton("停止显示时间");

fastWordsBtn.addActionListener(this);//注册事件监视器

startWordsBtn.addActionListener(this);

stopWordsBtn.addActionListener(this);

stopTimerBtn.addActionListener(this);

startTimerBtn.addActionListener(this);

textOfTime=newJTextField(10);

labelOfBlank=newJLabel("");

JPaneljp1=newJPanel();

jp1.add(textOfTime);

jp1.add(startTimerBtn);

jp1.add(stopTimerBtn);

add(jp1);

JPaneljp2=newJPanel();

jp2.add(labelOfBlank);

jp2.add(fastWordsBtn);

jp2.add(startWordsBtn);

jp2.add(stopWordsBtn);

add(jp2);

labelOfScrollWords=newJLabel("欢迎使用本系统!

");

//JLabel,负责滚动文字的显示

add(labelOfScrollWords);

scrollWordsThread=newThread(this);//创建线程

timerThread=newThread(this);

setBounds(100,100,420,200);

setVisible(true);

validate();

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

scrollWordsThread.start();//启动滚动文字线程

}

publicvoidrun(){

if(Thread.currentThread()==scrollWordsThread){

//如果当前正在运行中的线程是scrollWordsThread

while(true){

intx=labelOfScrollWords.getBounds().x;

inty=120;

x+=5;//水平坐标

labelOfScrollWords.setLocation(x,y);

//将滚动文字移动到新位置

if(x>380){

x=10;

labelOfScrollWords.setLocation(x,y);

}

try{

scrollWordsThread.sleep(1000);

}catch(InterruptedExceptionex){

}

if(stopScrolling==true){

//如果单击了”停止滚动“按钮,线程scrollWordsThread结束返回

return;

}

}

}

elseif(Thread.currentThread()==timerThread){

//如果当前正在运行中的线程是timerThread

while(true){

Datedate=newDate();

Stringstr=date.toString().substring(11,19);

//把date中的時間提取出来

textOfTime.setText(str);//把时间显示在文本框中

try{

Thread.sleep(1000);//休眠1000毫秒

}catch(InterruptedExceptionex){

}

if(stopTimer==true){

return;//如果单击了停止显示时间按钮,线程timerThread停止返回

}

}

}

}

publicvoidactionPerformed(ActionEvente){

if(e.getSource()==fastWordsBtn){

//如果单击了”加速“按钮,”吵醒“正在休眠的线程scrollWordsThread

scrollWordsThread.interrupt();

}elseif(e.getSource()==startWordsBtn){

//如果单击了”开始滚动“

if(!

scrollWordsThread.isAlive()){

//判定线程是否已经死亡(是否还占有实体)

scrollWordsThread=newThread(this);//给线程分配实体

stopScrolling=false;

scrollWordsThread.start();//启动线程

startWordsBtn.setEnabled(false);

//将”开始滚动“按钮设为不可用

}

}elseif(e.getSo

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

当前位置:首页 > 经管营销 > 公共行政管理

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

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