【实验八】多线程

news2024/11/30 6:42:05

1、完成书上268页习题第7题和实验题第1、2题

(1)第7题



import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class RollWords extends JFrame{	
	static RollWords.MyThread thread1, thread2;  //成员内部类

	private void showMe(){ 
		setLayout(new GridLayout(4,1));
		setBackground(Color.LIGHT_GRAY);
		setBounds(200,140,400,240);
		setVisible(true);  //显示窗口
	}
	
	private class MyThread extends Thread{ //内部线程类	继承
		//线程中要用到的组件
		private JLabel label;
		private JTextField text1,text2;
		private JButton start,interrupt;		
		private	int sleepTime;		
		
		public MyThread(String str){//创建界面
			super(str);
			
			//初始化字符串,文字后+若干空格
			text1 = new JTextField();
			for(int i=0; i<100; i++){
				str +=" ";
			}
			text1 = new JTextField(str);	
			
			sleepTime=(int)(Math.random()*100);//随机休眠xxms
			label=new JLabel("sleep");
			text2 = new JTextField(""+sleepTime);
			start = new JButton("启动");
			interrupt = new JButton("停止");
			
			init();		//在多线程运用中,启动一个线程之前要对一个对象进行一些初始化操作
			
			start.addActionListener(new MyListener());
			interrupt.addActionListener(new MyListener());	
		}
		
		private void init(){
			add(text1);
			JPanel panel;
			panel = new JPanel();
			panel.setLayout(new FlowLayout(FlowLayout.LEFT));
			panel.add(label);
			panel.add(text2);
			panel.add(start);
			panel.add(interrupt);
			add(panel);
			setVisible(true);  //显示线程中的组件
		}		
		
		public void run(){ //线程方法
			String str;
			while(true){
				try{
					str = text1.getText();
					str = str.substring(1)+str.substring(0,1);  //字符串滚动
					text1.setText(str);
					Thread.sleep(sleepTime);
				}catch(InterruptedException e){//睡眠期间被中断(按钮),发生异常
					break;
				}
			}
		}

		private class MyListener implements ActionListener{//内部类,处理事件监听,为线程类中的按钮服务
			public void actionPerformed(ActionEvent e){
				if(e.getSource()==thread1.start || e.getSource()==thread1.interrupt)
					actionPerformed(e, thread1);
					
				if(e.getSource()==thread2.start || e.getSource()==thread2.interrupt)
					actionPerformed(e, thread2);
			}
			
			private void actionPerformed(ActionEvent e, MyThread thread){
				if(e.getSource()==thread.start){//启动
					thread.sleepTime = Integer.parseInt(thread.text2.getText());
					thread.start();
					thread.start.setEnabled(false);
				}
				if(e.getSource()==thread.interrupt){//打断
					thread.interrupt();
					thread.interrupt.setEnabled(false);
				}
			}
		}
	}
		
	public static void main(String[] args){
		RollWords w = new RollWords();
		w.showMe();
		
		thread1 = w.new MyThread("welcome!");
		thread2 = w.new MyThread("How are you!");
	}
}

(2)实验1

package chap11.test.test1;

public class PrintCharacter implements Runnable{
	private int i=0;
	
	public static void main(String[] args) {
		PrintCharacter pc = new PrintCharacter();
		new Thread(pc).start();
		new Thread(pc).start();
		new Thread(pc).start();
	}
	
	public void run() {
		while(i<26){
			synchronized(this){//原子操作进行加锁,锁作为对象监听
				if(i>=26) break;
				System.out.print(Thread.currentThread().getName()+" ");
				System.out.println((char)(i+'a'));//a开始
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {//可能抛出的异常
					e.printStackTrace();
				}
				i++;
			}
		}
	}
}

 

(3)实验2 

package chap11.test.test2;

public class Number extends Thread{
	private Object message;
	
	public Number(Object message) {
		super();
		this.message = message;
	}

	public void run(){
		//1-52
		synchronized(message){
			for(int i=1; i<=52; i++){
				System.out.println(i+" ");
				if(i%2==0){
					message.notifyAll();
					try {
						message.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				
				
			}
		}
	}

}

 

package chap11.test.test2;

public class Char extends Thread{
	private Object message;
	
	public Char(Object message) {
		super();
		this.message = message;
	}

	public void run(){
		//a-z
		synchronized(message){
			for(int i=0; i<26; i++){
				System.out.println((char)(i+'a')+" ");
				message.notifyAll();
				try {
					message.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}				
			}
		}
	}

}
package chap11.test.test2;

public class Test {

	public static void main(String[] args) {
		Object message = new Object();
		Thread t1 = new Number(message);
		Thread t2 = new Char(message);
		t1.start();
		t2.start();
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/741170.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

西门子S7-200西门子200plc以太网配置向导

方案摘要&#xff1a; 西门子 S7200 系列 PLC通过MatrikonOPC实现以太网连接&#xff0c;捷米特ETH-S7200-JM01以太网模块为 PLC200转换出以太网通讯接口。 功能简介 MatrikonOPC是世界上最大的OPC开发商和供应商&#xff0c;我们的产品涵盖了OPC服务器、客户端、应用程序、O…

为D1定义一个f()函数,重做练习1-3,并解释其结果

运行代码&#xff1a; //为D1定义一个f()函数&#xff0c;重做练习1-3,并解释其结果 #include"std_lib_facilities.h" //---------------------------------------------------------------------- //定义B1类。 class B1 { public:virtual void vf() { cout<<…

第四章 数学知识(二)——欧拉函数,快速幂,扩展欧与中国剩余定理

文章目录 欧拉函数线性筛求欧拉函数欧拉定理 快速幂逆元 扩展欧几里得中国剩余定理扩展中国剩余定理 欧拉函数练习题873. 欧拉函数874. 筛法求欧拉函数 快速幂练习题875. 快速幂876. 快速幂求逆元 扩展欧练习题877. 扩展欧几里得算法878. 线性同余方程 中国剩余定理练习题204. …

Linux进程信号(一)

信号产生 1.信号基础知识2.初步认识信号3.signal函数4.技术应用角度的信号5.调用系统函数向进程发信号6.由软件条件产生的信号7.硬件异常产生信号8.core &#x1f31f;&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f…

从CoCo到喜茶,新茶饮品牌领悟出海的“九阴真经”了吗?

炎炎夏日里&#xff0c;一杯冰凉的奶茶和果茶受到了更多追捧。但是&#xff0c;中国新茶饮品牌却站在了一个十字路口。 随着新茶饮迈入“万店时代”&#xff0c;国内市场已经出现了明显的内卷现象&#xff0c;头部品牌之间的竞争日趋激烈&#xff0c;中小品牌的生存空间被挤压…

OpenGL的学习记录(一)(一些基本概念)

1.OpenGL是什么&#xff1f; OpenGL是一组各个GPU厂家一起遵循的约定。 2.GLFW&#xff0c;GLAD分别是什么&#xff1f; GLFW解决系统层面的不同&#xff0c;是我们与系统之间的隔离&#xff0c;如&#xff08;创建窗口&#xff0c;定义上下文&#xff0c;处理用户输入&#x…

数据结构--树和森林的遍历

数据结构–树和森林的遍历 树的先根遍历 void PreOrder(TreeNode* R) {if (R ! NULL){visit(R);while (R还有下一个子树T)PreOrder(T);} }树和二叉树的转化后》 树的先根遍历序列与这棵树相应二叉树的先序序列相同。 \color{red}树的先根遍历序列与这棵树相应二叉树的先序序列相…

txt文本筛选—python操作

需求&#xff1a;若文档中某行最后一列内容为0&#xff0c;则删除该行&#xff0c;否则保留该行内容&#xff0c;并将筛选后的内容保存到新的文本文档中。 # 读取原始txt文件 with open(depth_values.txt, r) as file:lines file.readlines()# 过滤掉第三列内容为0的行 filter…

WIFISKY-7层流控路由器 后台任意命令执行漏洞复现

这个漏洞相当于是两个漏洞的结合&#xff0c;首先是弱口令漏洞 admin/admin 我们成功登录后台之后才能进行任意命令执行漏洞的操作&#xff0c;我们登录之后找到系统维护-系统控制台 然后我们使用命令拼接的操作来实现任意命令执行的操作 ifconfig & cat /etc/passwd

自定义seg_decoder组件并创建Nios系统(二)

3.搭建Nios Ⅱ系统 3.1添加组件 系统会自动添加一个clk的clock source组件作为时钟组件&#xff0c;可直接使用该组件作为系统时钟 添加Nios Ⅱ处理器&#xff0c;将Nios Processor组件设置框中Nios Core选择Nios Ⅱ/f&#xff08;报错先不管&#xff09; 添加On-chip Memory…

揭秘未来:AI、自然资源与时空大数据的完美结合!JNPF快速开发平台引领无限潜能!

前言 在当今数智时代&#xff0c;人工智能&#xff08;AI&#xff09;的应用正以前所未有的方式改变着各个领域的发展路径。尤其在融合自然资源、时空大数据的领域&#xff0c;AI呈现出了崭新的形式&#xff0c;展现着巨大的潜力与前景。 技术的发展离不开数据的支持 随着人工…

【STM32MP135】移除stm32mp135d-atk-u-boot.dtsi设备树config节点,否则会进入fastboot下载模式

文件路径&#xff1a;u-boot-stm32mp-v2021.10-stm32mp1-r1/arch/arm/dts/stm32mp135d-atk-u-boot.dtsi

TVS二极管原理

在管子两端的电压大于一定值时&#xff0c;TVS管被反向击穿&#xff0c;瞬间形成一个导通回路&#xff0c;将管子两端的大电流导出&#xff0c;并且将管子两段的电压钳制在一个固定电压&#xff0c;进而保护和它并联的电路。 挑选TVS管先看VRWM&#xff0c;尽量与最大工作电压接…

洛谷:P5018 对称二叉树 ← NOIP2018 普及组T4

【题目来源】https://www.luogu.com.cn/problem/P5018https://www.acwing.com/problem/content/478/【题目描述】一棵有点权的有根树如果满足以下条件&#xff0c;则被轩轩称为对称二叉树&#xff1a; 1.二叉树&#xff1b; 2.将这棵树所有节点的左右子树交换&#xff0c;新树和…

关于Python的Numpy库reshape()函数的用法

1.介绍 更改数组的形状&#xff0c;不改变原数组 2.语法 a np.reshape(mat, newshape, order ‘C’) a : newshape形状的新数组 mat : 原数组 newshape&#xff1a;(1, 2)/ 1, 2 都可以改为1行2列的数组 order&#xff1a;读取原数组的规则&#xff0c;默认为C&#xff08;…

Go语言精进之路读书笔记—第三章 声明、类型、语句与控制结构(五)map

map 是啥&#xff1f; 无序的 key value 键值对。 创建变量有两种方式&#xff1a; 基本操作&#xff1a; 插入数据&#xff1a; 获取数据&#xff1a; 查找和数据读取&#xff1a; comma ok 查找法, 被称为最佳实践。 获取value 删除数据 遍历数据 想要有序的需要这样做&a…

CSS 沿着同一个方向旋转

主要解决旋转360后倒转的问题&#xff0c;沿着一个方向旋转&#xff0c;而不是倒回去重新开始。 效果 源码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>同方向旋转</title><script src"https://dp.rc1…

【STM32MP135】修复EMMC模式启动时,uboot启动识别为usb0设备问题

文件路径&#xff1a;u-boot-stm32mp-v2021.10-stm32mp1-r1/arch/arm/dts/stm32mp135d-atk.dts 文件路径&#xff1a;u-boot-stm32mp-v2021.10-stm32mp1-r1/configs/stm32mp13_defconfig

ChatGLM 实践赛之学术工具创意开发丨智谱 AI × 和鲸科技

2022 年底以来&#xff0c;LLM 大规模语言模型备受瞩目。今年 3 月中旬&#xff0c;智谱 AI 与清华大学强强联合&#xff0c;重磅发布了 ChatGLM-6B 开源模型。截止 6 月 24 日&#xff0c;该模型的下载量超过三百万人次&#xff0c;并在 Hugging Face&#xff08;HF&#xff0…

jdbc中jdbcTemplate的事务问题

jdbcTemplate的增删改都用 update 查询用queryForList 1. 2. 3.虽然事务未提及也可以查到对应的数据