网络编程技术次课多线程代码.docx
- 文档编号:18648239
- 上传时间:2023-08-24
- 格式:DOCX
- 页数:16
- 大小:20.09KB
网络编程技术次课多线程代码.docx
《网络编程技术次课多线程代码.docx》由会员分享,可在线阅读,更多相关《网络编程技术次课多线程代码.docx(16页珍藏版)》请在冰点文库上搜索。
网络编程技术次课多线程代码
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=newT
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 编程 技术 多线程 代码