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