Java 多线程编程 实验二

  • 1.创建键盘操作练习
  • 2. 双线程猜数字
  • 3. 月亮围绕地球

1.创建键盘操作练习

题目描述:

编写一个Java应用程序,在主线程中再创建两个线程,
一个线程负责给出键盘上字母键上的字母,另一个线程负责让用户在命令行 输入所给出的字符。

(1) 实验运行结果截图:
(2) 代码补充结果为:

【代码1】创建线程 giveChar:giveChar = new GiveLetterThread();
【代码2】创建线程 typeChar:typeChar = new InputLetterThread();
【代码3】调用sleep方法使得线程中断 sleepLength 毫秒: Thread.sleep(sleepLength);

(3) 源码:
TypeKey.java代码:

package Question1;public class TypeKey {public static void main(String args[]){System.out.println("键盘练习(输入#结束程序)");System.out.println("输入显示的字母(回车)\n");Letter letter;letter = new Letter();GiveLetterThread giveChar;InputLetterThread typeChar;giveChar = new GiveLetterThread();//【代码1】创建线程 giveChargiveChar.setLetter(letter);giveChar.setSleepLength(3200);typeChar = new InputLetterThread();//【代码2】创建线程 typeChartypeChar.setLetter(letter);giveChar.start();typeChar.run();}
}

Letter.java代码:

package Question1;public class Letter {char c = '\0';public void setChar(char c){this.c = c;}public char getChar(){return c;}
}

GiveLetterThread.java代码:

package Question1;public class GiveLetterThread extends Thread{Letter letter;char startChar = 'a',endChar = 'z';int sleepLength = 5000;public void setLetter(Letter letter){this.letter = letter;}public void setSleepLength(int n) {sleepLength = n;}public void run(){char c = startChar;while (true){letter.setChar(c);System.out.printf("显示的字符: %c\n",letter.getChar());try{Thread.sleep(sleepLength);//【代码3】 //调用sleep方法使得线程中断 sleepLength 毫秒} catch (InterruptedException e) {}c = (char)(c+1);if(c > endChar)c = startChar;}}
}

InputLetterThread.java代码:

package Question1;import java.util.Scanner;public class InputLetterThread extends Thread{Scanner reader;Letter letter;int score = 0;InputLetterThread(){reader = new Scanner(System.in);}public void setLetter(Letter letter) {this.letter = letter;}@Overridepublic void run() {while (true){//System.out.printf("输入显示的字母(回车)\n");String str = reader.nextLine();char c = str.charAt(0);if(c == letter.getChar()){score++;System.out.printf("\t\t输入对了,目前分数:%d\n",score);}else {System.out.printf("\t\t输入错了,目前分数:%d\n",score);}if(c == '#')System.exit(0);}}
}

2. 双线程猜数字

题目描述:

用两个线程玩猜数字游戏,第一个线程负责随机给出1~10之间的一个整数,第二个线程负责猜出这个数。
要求:每当第二个线程给出自己的猜测后,第一个线程都会提示“猜小了”、“猜 大了”或“猜对了”。猜数之前,要求第二个线程要等待第一个线程设置好 要猜测的数。第一个线程设置好猜测数之后,两个线程还要相互等待,其原 则是:第二个线程给出自己的猜测后,等待第一个线程给出的提示;第一个 线程给出提示后,等待第二个线程给出猜测,如此进行,直到第二个线程给 出正确的猜测后,两个线程进入死亡状态。

(1) 实验运行结果截图:

(2) 代码补充结果为:

【代码1】创建giveNumberThread,当前 Number 类的实例是 giveNumberThread 的目标对象:giveNumberThread = new Thread(this);
【代码2】创建guessNumberThread,当前Number类的实例是 guessNumberThread 的目标对象: guessNumberThread = new Thread(this);

(3) 源码:
TwoThreadGuessNumber.java代码:

package Question2;public class TwoThreadGuessNumber {public static void main(String args[]){Number number = new Number();number.giveNumberThread.start();number.guessNumberThread.start();}
}

Number.java代码:

package Question2;public class Number implements Runnable{final int SMALLER = -1,LARGER = 1,SUCCESS = 8;int realNumber,guessNumber,min = 0,max = 100,message = SMALLER;boolean pleaseGuess = false,isGiveNumber = false;Thread giveNumberThread,guessNumberThread;Number(){giveNumberThread = new Thread(this);//【代码1】创建 giveNumberThread,当前 Number 类的实例是 giveNumberThread 的目标对象guessNumberThread = new Thread(this);//【代码2】创建 guessNumberThread,当前 Number 类的实例是 guessNumberThread 的目标对象}public void run() {for (int count = 1;true;count++){setMessage(count);if(message == SUCCESS)return;}}public synchronized void setMessage(int count){if(Thread.currentThread()==giveNumberThread && isGiveNumber==false){realNumber = (int)(Math.random()*100)+1;System.out.println("随机给你一个1至100之间的数,猜猜是多少?");isGiveNumber = true;pleaseGuess = true;}if(Thread.currentThread()==giveNumberThread){while (pleaseGuess == true)try {wait(); //让出 CPU 使用权,让另一个线程开始猜数}catch (InterruptedException e){}if (realNumber > guessNumber){ // 结束等待后,根据另一个线程的猜测给出提示message = SMALLER;System.out.println("你猜小了");}else if (realNumber < guessNumber){message = LARGER;System.out.println("你猜大了");}else {message = SUCCESS;System.out.println("恭喜,你猜对了");}pleaseGuess = true;}if(Thread.currentThread() == guessNumberThread && isGiveNumber == true){while (pleaseGuess == false)try {wait(); //让出 CPU 使用权,让另一个线程给出提示}catch (InterruptedException e){}if (message == SMALLER){min = guessNumber;guessNumber = (min+max)/2;System.out.println("我第"+count+"次猜这个数是:"+guessNumber);}else if (message == LARGER){max = guessNumber;guessNumber = (min+max)/2;System.out.println("我第"+count+"次猜这个数是:"+guessNumber);}pleaseGuess = false;}notifyAll();}
}

3. 月亮围绕地球

题目描述:

编写一个应用程序,模拟月亮围绕地球转。其中月亮和地球为给定图片如下所示:



(1) 实验运行结果截图:

(2) 代码补充结果为:

【代码1】创建 timer,振铃间隔是 20 毫秒,当前 Earth 对象为其监视器:
timer = new Timer(20,this);
【代码2】创建 timer,振铃间隔是100毫秒,当前Sky对象为其监视器:
timer = new Timer(100,this);

(3) 源码:
MainClass.java代码:

package Question3;import javax.swing.*;
import java.awt.*;public class MainClass {public static void main(String args[]){Sky sky = new Sky();             //构造了一个天空(标签对象)JFrame frame = new JFrame();    //构造了一个框架(窗体)frame.add(sky);                 //将天空(标签)置于框架(窗体)里frame.setTitle("月亮绕地球转");frame.setSize(500,500);frame.setVisible(true);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.getContentPane().setBackground(Color.white);}
}

Earth.java代码:

package Question3;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class Earth extends JLabel implements ActionListener {JLabel moon; //显示月亮的外观Timer timer;double pointX[] = new double[360],pointY[] = new double[360];int w = 200,h = 200,i = 0;Earth(){setLayout(new FlowLayout());setPreferredSize(new Dimension(w,h));timer = new Timer(20,this);//【代码1】创建 timer,振铃间隔是 20 毫秒,当前 Earth 对象为其监视器setIcon(new ImageIcon("earth.jpg"));setHorizontalAlignment(SwingConstants.CENTER);moon = new JLabel(new ImageIcon("moon.png"),SwingConstants.CENTER);add(moon);moon.setPreferredSize(new Dimension(60,60));pointX[0] = 0;pointY[0] = h/2;double angle = 1*Math.PI/180;  //刻度为 1 度for(int i = 0;i < 359;i++){    //计算出数组中各个元素的值pointX[i+1] = pointX[i]*Math.cos(angle) - Math.sin(angle)*pointY[i];pointY[i+1] = pointY[i]*Math.cos(angle) + Math.sin(angle)*pointX[i];}for (int i = 0;i < 360;i++){pointX[i] = 0.8*pointX[i] + w/2;   //坐标缩放,平移pointY[i] = 0.8*pointY[i] + h/2;}timer.start();}@Overridepublic void actionPerformed(ActionEvent e) {i = (i+1)%360;moon.setLocation((int)pointX[i]-30,(int)pointY[i]-30);}
}

Sky.java代码:

package Question3;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class Sky extends JLabel implements ActionListener {Earth earth;Timer timer;double pointX[] = new double[360],pointY[] = new double[360];int w = 400,h = 400,i = 0;Sky(){setLayout(new FlowLayout());timer = new Timer(100,this);//【代码2】创建 timer,振铃间隔是100毫秒,当前Sky对象为其监视器setPreferredSize(new Dimension(w,h));earth = new Earth();add(earth);earth.setPreferredSize(new Dimension(200,200));pointX[0] = 0;pointY[0] = h/2;double angle = 1*Math.PI/180;  //刻度为 1 度for(int i = 0;i < 359;i++){    //计算出数组中各个元素的值pointX[i+1] = pointX[i]*Math.cos(angle) - Math.sin(angle)*pointY[i];pointY[i+1] = pointY[i]*Math.cos(angle) + Math.sin(angle)*pointX[i];}for (int i = 0;i < 360;i++){pointX[i] = 0.5*pointX[i] + w/2;   //坐标缩放,平移pointY[i] = 0.5*pointY[i] + h/2;}timer.start();}@Overridepublic void actionPerformed(ActionEvent e) {i = (i+1)%360;earth.setLocation((int)pointX[i]-100,(int)pointY[i]-100);}
}

Java 多线程编程 实验题相关推荐

  1. Java多线程编程那些事:volatile解惑--转

    http://www.infoq.com/cn/articles/java-multi-thread-volatile/ 1. 前言 volatile关键字可能是Java开发人员"熟悉而又陌 ...

  2. 《Java多线程编程核心技术》——1.5节sleep()方法

    本节书摘来自华章社区<Java多线程编程核心技术>一书中的第1章,第1.5节sleep()方法,作者高洪岩,更多章节内容可以访问云栖社区"华章社区"公众号查看 1.5 ...

  3. java多线程编程01---------基本概念

    一. java多线程编程基本概念--------基本概念 java多线程可以说是java基础中相对较难的部分,尤其是对于小白,次一系列文章的将会对多线程编程及其原理进行介绍,希望对正在多线程中碰壁的小 ...

  4. java多线程编程同步方法_实践【Java多线程编程核心技术】系列:同步方法造成的无限等待...

    本文实践来自于[Java多线程编程核心技术]一书! 同步方法容易造成死循环,如-- 类Service.java: package service; public class Service { syn ...

  5. java超线程_超线程多核心下Java多线程编程技术分析

    在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述超线程多核心下Java多线程编程技术分析,更多Java专业知识,广州疯狂 ...

  6. Java多线程编程实战指南

    内容简介 随着CPU 多核时代的到来,多线程编程在充分利用计算资源.提高软件服务质量方面扮演了越来越重要的角色.而解决多线程编程中频繁出现的普遍问题可以借鉴设计模式所提供的现成解决方案.然而,多线程编 ...

  7. Java多线程编程实战指南+设计模式篇pdf

    下载地址:网盘下载 随着CPU 多核时代的到来,多线程编程在充分利用计算资源.提高软件服务质量方面扮演了越来越重要的角色.而 解决多线程编程中频繁出现的普遍问题可以借鉴设计模式所提供的现成解决方案.然 ...

  8. Java多线程编程模式实战指南(二):Immutable Object模式--转载

    本文由本人首次发布在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-immutable-o ...

  9. java多线程编程_Java多线程编程实战指南+设计模式篇.pdf

    Java多线程编程实战指南+设计模式篇.pdf 对Java架构技术感兴趣的工程师朋友们可以关注我,转发此文后私信我"Java"获取更多Java编程PDF资料(附送视频精讲) 关注我 ...

最新文章

  1. 使用 JQUERY 为文本框增加提示文字
  2. join为什么每个字符都分割了 js_JS截取与分割字符串常用技巧总结
  3. Spring创建Bean的3种方式
  4. matlab simulink笔记04——switch模块
  5. 虚拟内存的作用、分页系统实现虚拟内存原理
  6. matlab ode45 初值,为什么设定的初值在ode45里无效?
  7. DelphiXE开发坑
  8. MDIO总线相关_2
  9. 19c(19.3) 单机数据库静默安装
  10. 中文版 Ubuntu主目录里的桌面等中文目录名称改成英文
  11. 苹果8的爆料这么多?为什么...
  12. C语言写的学生管理系统
  13. [语义分割]SPP、空洞卷积与ASPP总结
  14. c 语言运算符号大全,c语言关系运算符号有哪些?
  15. 互联网公司技术网站 公众号
  16. Delphi 10.3.1 Memo打开/保存utf-8不乱码的方法,网上都是胡天!
  17. 利用RSS进行学术期刊订阅
  18. java做界面比vb难_请谈谈java的优点和缺点,最好能和vc,delphi,vb作个比较。
  19. linux下有没有蜘蛛纸牌游戏,在Linux下可用Wine安装和运行蜘蛛纸牌、浩方电竞平台...
  20. HaaS助力蜂农脱贫致富之路

热门文章

  1. qq有哪些引流方法?2020最新QQ引流方法汇总
  2. apache IOUtils的读取文件并转化为clazz
  3. 【解决方案】GB28181/RTSP/SDK/Ehome协议支持级联视频智能分析平台EasyCVR搭建小区园区视频监控系统
  4. OC语言基础内容 类的定义 第一个OC
  5. SAS初学者笔记---001
  6. Myeclispe 2016 stable1.0版 完美破解
  7. 基于android的电子词典设计_基于Android的电子词典软件的设计与实现 (含外文翻译).doc...
  8. Ansys Zemax / SPEOS | 3片式LCD投影仪的设计与仿真
  9. RK3399平台开发系列讲解(电源管理篇)11.7、PM callback
  10. CSS3发光字体几种效果