Java 多线程编程 实验题

article/2025/9/16 5:14:43

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. 月亮围绕地球

题目描述:

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

earth.jpg
moon.jpg
(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);}
}

http://chatgpt.dhexx.cn/article/xOceqFv5.shtml

相关文章

Python多线程编程(详细:适合小白入门)

目录 前言 一、进程 1.多任务 2.进程 3.多进程完成多任务 3.1进程的创建步骤 3.2通过进程类创建进程对象 3.3创建进程和启动的代码 4. 进程执行带有参数的任务 5.获取进程编号 6.进程的注意点 6.1主进程会等待所有的子进程执行结束后再结束 6.2设置守护主进程&…

使用qt实现多线程编程

目录 1、线程基础 1.1、GUI线程与工作线程 1.2、数据的同步访问 2、QT多线程简介 3、QThread线程类 4、创建并启动线程 QThread类提供不依赖于平台的管理线程的方法。一个QThread类的对象管理一个线程&#xff0c;一 般从QThread继承一个自定义类&#xff0c;并重定义虚函…

ZMQ之多线程编程

使用ZMQ进行多线程编程&#xff08;MT编程&#xff09;将会是一种享受。在多线程中使用ZMQ套接字时&#xff0c;你不需要考虑额外的东西&#xff0c;让它们自如地运作就好。 使用ZMQ进行多线程编程时&#xff0c;不需要考虑互斥、锁、或其他并发程序中要考虑的因素&#xff0c;…

C++之多线程编程

一、并发的实现 1.多进程并发主要解决进程间通信的问题 ①同一电脑上&#xff1a;管道、文件、消息队列、内存共享。 ②不同电脑上&#xff1a;socket网络通信。 2. 单进程中的多个线程并发&#xff08;一个主线程多个子线程实现并发&#xff09; ①一个进程中的所有线程共享内…

Springboot异步多线程编程

文章目录 一、基础知识二、什么时候用同步&异步三、什么时候需要使用多线程四、springboot异步多线程编程实现 一、基础知识 同步&#xff1a;同步就是指一个进程在执行某个请求的时候&#xff0c;若该请求需要一段时间才能返回信息&#xff0c;那么这个进程将会一直等待下…

【线程】多线程编程

目录 一、概念 1.进程与线程的区别是&#xff1f;&#xff08;常问&#xff09; 2.线程与fork系统调用 3.线程的优缺点 4.线程的实现方式 二、线程函数 1.pthread_create 2.pthread_exit 3.pthread_join 4.pthread_cancel 三、线程的使用 1.线程的基本操作 2.并发…

多线程编程及线程间通信机制

对进程线程的印象还是比较好的,这对于学习C高级的朋友是非常重要的,怎样更快的学习到线程的具体使用呢?最好的办法自然是练习再练习,然后还要看很多的代码才是,之前又听说了一个IT同行过劳死,特别的提醒广大的IT从业者,要注意合理的作息习惯,健康才是最重要的,下面结合…

多线程编程

多线程指的是一个程序中包含两个或者两个以上的线程&#xff0c;多线程的提出是为提高代码的执行效率&#xff0c;这就好比工厂中的流水线&#xff0c;只有一条称为单线程&#xff0c;有多条流水线就称为多线程。多线程提高效率的同时由于并发执行的不确定性&#xff0c;导致出…

两种 C++ 多线程编程方式,看完不懂打我...

多线程在实际编程中的重要性不言而喻&#xff0c;对 C 而言&#xff0c;当我们需要使用多线程时&#xff0c;有多种方案可供选择。比如 POSIX 线程 pthread、boost::thread 库、C11 开始支持的 std::thread 库&#xff0c;以及其他一些第三方库 libdispatch&#xff08;GCD&…

ARP攻击模拟工具

以下是本人平时的一些小作品&#xff0c;特此和大家一起分享... ARP攻击模拟工具 第一代 说明&#xff1a; 实现模拟以太网的ARP欺骗攻击和IP地址冲突攻击。 此为本人早期作品&#xff0c;固比较简陋和不完善&#xff0c;漏洞及错误之处可能较多请多多包涵&#xff01; 开发环…

ARP断网攻击

在之前的文章当中&#xff0c;我已经向大家介绍了关于ARP的欺骗原理。再进一步&#xff0c;将其中的原理运用到实战中去&#xff0c;又会有什么效果呢&#xff1f;ARP又可以给我们带来哪些具体的作用呢&#xff1f;毕竟实践要来支撑&#xff0c;我们之前学过的ARP欺骗原理。 我…

ARP-欺骗攻击

测试环境&#xff08;kali:192.168.189.7 win7:192.168.189.6 网关:192.168.189.2&#xff09; arpspoof -i eth0 -t 192.168.189.6 192.168.189.2 &#xff08;目标地址网关地址&#xff09; 接收获取的信息 随意登陆一个网站&#xff0c;可发现用户名及密码已被获取。可以…

ARP攻击原理及解决方法,很实用

故障原因】 局域网内有人使用ARP欺骗的木马程序&#xff08;比如&#xff1a;传奇盗号的软件&#xff0c;某些传奇外挂中也被恶意加载了此程序&#xff09;。 【故障原理】 要了解故障原理&#xff0c;我们先来了解一下ARP协议。 在局域网中&#xff0c;通过ARP协议来完成I…

ARP攻击怎么解决最安全

ARP攻击是指攻击者通过伪造网络中的ARP协议数据包&#xff0c;欺骗其他计算机的网络通信&#xff0c;从而实现中间人攻击等目的。 下面是ARP攻击的解决方法&#xff1a; 静态ARP表绑定MAC地址&#xff1a;在网络管理员的控制下&#xff0c;将主机的IP地址与MAC地址进行绑定&am…

ARP攻击及原理

ARP攻击原理:但凡局域网内存在arp攻击&#xff0c;说明网络存在“中间人” 1.PC1需要跟PC2通信&#xff0c;通过ARP请求包询问PC2的MAC地址&#xff0c;由于采用广播的形式&#xff0c;所以交换机会将ARP请求包从接口PC1广播到PC2和PC3。(注&#xff1a;交换机收到广播/组播/未…

ARP攻击、欺骗及防御

一、广播与广播域概述 1、广播与广播域 广播&#xff1a;将广播地址做为目的地址的数据帧。 广播域&#xff1a;网络中能接收到同一个广播所有节点的集合。 2、MAC地址广播 广播地址为FF-FF-FF-FF-FF-FF 3、IP地址广播 1&#xff09;255.255.255.255 2&#xff09;广播…

ARP攻击原理和kali实现ARP攻击

目录 一、ARP协议和ARP攻击1.ARP协议2.利用Wireshark分析ARP数据包3.ARP攻击 二、kali实现ARP攻击和ARP欺骗1.实验过程2.问题记录T_T 一、ARP协议和ARP攻击 1.ARP协议 ARP协议&#xff0c;地址解析协议&#xff08;Address Resolution Protocol&#xff09;&#xff0c;用来实…

怎么处理ARP攻击

ARP故障说明: ping 的时候可能好久才能接收到一个响应&#xff0c;或者说干脆就Ping不通。网络时好时坏&#xff0c;通过ARP -a命令不能看到同网段的在线用户&#xff0c;但是net view 可以看到全网开放共享的电脑名&#xff0c;这时候就需要注意了&#xff0c;可能是ARP攻击。…

网络安全--ARP攻击原理与防护

目录 一.ARP的原理 二.ARP攻击现象及危害 三.ARP攻击的原理 四.ARP防护 在局域网当中&#xff0c;有一个协议由于它的特性一旦遭受攻击就非常麻烦。首先是它的攻击门槛比较低&#xff0c;找到一些小工具就能实现攻击&#xff0c;而且危害极大。这个协议就是ARP协议。 ARP攻击是…

渗透技术——ARP攻击

Part 1: ARP攻击介绍 ARP&#xff08;Address Resolution Protocol&#xff0c;地址解析协议&#xff09;是一个位于TCP/IP协议栈中的底层协议&#xff0c;负责将某个IP地址解析成对应的MAC地址。而ARP攻击就是通过伪造IP地址和MAC地址实现ARP欺骗&#xff0c;能够在网络中产生…