Java与面向对象程序设计实验教程第7章 线程
多线程程序实验报告(3篇)

第1篇一、实验目的1. 理解多线程的概念和作用。
2. 掌握多线程的创建、同步和通信方法。
3. 熟悉Java中多线程的实现方式。
4. 提高程序设计能力和实际应用能力。
二、实验环境1. 操作系统:Windows 102. 开发工具:IntelliJ IDEA3. 编程语言:Java三、实验内容本次实验主要完成以下任务:1. 创建多线程程序,实现两个线程分别执行不同的任务。
2. 使用同步方法实现线程间的同步。
3. 使用线程通信机制实现线程间的协作。
四、实验步骤1. 创建两个线程类,分别为Thread1和Thread2。
```javapublic class Thread1 extends Thread {@Overridepublic void run() {// 执行Thread1的任务for (int i = 0; i < 10; i++) {System.out.println("Thread1: " + i);}}}public class Thread2 extends Thread {@Overridepublic void run() {// 执行Thread2的任务for (int i = 0; i < 10; i++) {System.out.println("Thread2: " + i);}}}```2. 创建一个主类,在主类中创建两个线程对象,并启动它们。
```javapublic class Main {public static void main(String[] args) {Thread thread1 = new Thread1();Thread thread2 = new Thread2();thread1.start();thread2.start();}```3. 使用同步方法实现线程间的同步。
```javapublic class SynchronizedThread extends Thread {private static int count = 0;@Overridepublic void run() {for (int i = 0; i < 10; i++) {synchronized (SynchronizedThread.class) {count++;System.out.println(Thread.currentThread().getName() + ": " + count);}}}}public class Main {public static void main(String[] args) {Thread thread1 = new SynchronizedThread();Thread thread2 = new SynchronizedThread();thread1.start();thread2.start();}```4. 使用线程通信机制实现线程间的协作。
java多线程程序设计实验总结

java多线程程序设计实验总结一、实验目的本次实验旨在通过编写Java多线程程序,掌握多线程编程的基本概念和技能,理解多线程程序的运行原理,提高对Java语言的熟练度。
二、实验内容本次实验分为三个部分:创建线程、线程同步和死锁。
2.1 创建线程创建线程有两种方式:继承Thread类和实现Runnable接口。
继承Thread类需要重写run方法,在run方法中编写线程执行的代码;实现Runnable接口需要实现run方法,并将其作为参数传入Thread类的构造函数中。
在创建多个线程时,可以使用同一个Runnable对象或者不同的Runnable对象。
2.2 线程同步当多个线程同时访问共享资源时,可能会出现数据不一致等问题。
为了避免这种情况,需要使用同步机制来保证各个线程之间的协调运行。
常见的同步机制包括synchronized关键字和Lock接口。
synchronized关键字可以用来修饰方法或代码块,在执行该方法或代码块时,其他所有试图访问该方法或代码块的线程都必须等待当前执行完成后才能继续执行。
Lock接口提供了更加灵活和高级的锁机制,可以支持更多种类型的锁,如读写锁、可重入锁等。
2.3 死锁死锁是指两个或多个线程在互相等待对方释放资源的情况下,都无法继续执行的现象。
死锁的发生通常由于程序设计不当或者资源分配不合理所导致。
为避免死锁的发生,可以采取以下措施:避免嵌套锁、按照固定顺序获取锁、避免长时间占用资源等。
三、实验过程本次实验我编写了多个Java多线程程序,包括创建线程、线程同步和死锁。
其中,创建线程部分我使用了继承Thread类和实现Runnable 接口两种方式来创建线程,并测试了多个线程之间的并行执行情况;在线程同步部分,我使用synchronized关键字和Lock接口来保证共享资源的访问安全,并测试了多个线程同时访问共享资源时是否会出现数据不一致等问题;在死锁部分,我编写了一个简单的死锁程序,并通过调整程序代码来避免死锁的发生。
【实验】java多线程实验报告

【关键字】实验java多线程实验报告篇一:西北农林科技大学java多线程实验报告实验7 多线程1.实验目的(1) 掌握Java多线程的概念和实现方法(2) 掌握Java多线程的同步问题2.实验内容任务一:火车售票假设有火车票1000张,创建10个线程模拟10个售票点,每个售票点100毫秒买一张票。
打印出售票过程,注意使用synchronized确保同一张票只能卖出一次。
程序运行结果见左图。
打开EclipseTickets.javapublic class Ticket extends Thread {int ticket =1000; String name =""; public void run(){ while(true){synchronized(name){ if(ticket"第" + Thread.currentThread().getName()+ "售票点卖出了第" + ticket-- + "张票");}} }}} try{ } catch(InterruptedException e){ } Thread.sleep(100);Test.javapublic class Test {} public static void main(String args[]){} Ticket t = new Ticket(); new Thread(t,"1").start(); new Thread(t,"2").start(); new Thread(t,"3").start(); new Thread(t,"4").start(); new Thread(t,"5").start(); new Thread(t,"6").start(); new Thread(t,"7").start(); new Thread(t,"8").start(); new Thread(t,"9").start(); new Thread(t,"10").start();任务二:银行存款假设某家银行,它可接受顾客的汇款,每做一次汇款,便可计算出汇款的总额。
JAVA多线程的实验报告

JAVA多线程的实验报告深圳大学实验报告课程名称:Java程序设计实验项目名称:线程学院:计算机与软件学院专业:指导教师:谭舜泉报告人:学号:班级:3班实验时间:2021年12月13日实验报告提交时间:2021年12月26日教务部制一、实验内容:8.2.3 吵醒休眠的线程实验代码:class Shop implements Runnable {Thread zhangWorker,wangWorker,boss; Shop() {boss=new Thread(this);//创建boss,Shop对象为boss目标对象zhangWorker=new Thread(this); wangWorker=new Thread(this); zhangWorker.setName(\张工\); wangWorker.setName(\王工\); boss.setName(\老板\); }public void run() {int i=0;if(Thread.currentThread()==zhangWorker) {while(true) {try {i++;System.out.printf(\已搬运了%d箱苹果\\n\,zhangWorker.getName(),i); if(i==3)return;Thread.sleep(*****); }//zhangWorker休眠10秒}catch(InterruptedException e){System.out.printf(\让%s继续工作\,boss.getName(),zhangWorker.getName());} } }else if(Thread.currentThread()==wangWorker) {while(true) {try{i++;System.out.printf(\已搬运了%d箱香蕉\\n\,wangWorker.getName(),i); if(i==3) return;Thread.sleep(*****); }catch(InterruptedException e){System.out.printf(\让%s继续工作\,boss.getName(),wangWorker.getName());} } }else if(Thread.currentThread()==boss) {while(true) {zhangWorker.interrupt();//吵醒zhangWorker wangWorker.interrupt();if(!(wangWorker.isAlive()||zhangWorker.isAlive())) {System.out.printf(\下班\,boss.getName()); return; } } } } }public class ShopExample {public static void main(String args[]) {Shop shop=new Shop();shop.zhangWorker.start(); shop.wangWorker.start(); shop.boss.start(); } }实验截图:8.2.4 排队买票实验代码:class TicketSeller//负责卖票的类{int fiveNumber=1,tenNumber=0,twentyNumber=0;public synchronized void sellTicket(int receiveMoney,int buyNumber) {if(receiveMoney==5) {fiveNumber=fiveNumber+1;System.out.printf(\给我5元钱,这是您的1张入场券\,Thread.currentThread().getName()); }else if(receiveMoney==10buyNumber==2) {tenNumber=tenNumber+1;System.out.printf(\给我10元钱,这是您的2张入场券\,Thread.currentThread().getName()); }else if(receiveMoney==10buyNumber==1) {while(fiveNumber1)//给出线程等待的条件{try {System.out.printf(\靠边等\,Thread.currentThread().getName()); wait();//线程进入等待状态System.out.printf(\结束等待状态\\n\,Thread.currentThread().getName()); }catch(InterruptedException e){} }fiveNumber=fiveNumber-1; tenNumber=tenNumber+1;System.out.printf(\给我10元钱,找您5元钱,这是您的1张入场券\,Thread.currentThread().getName()); }else if(receiveMoney==20buyNumber==1) {while(fiveNumber1||tenNumber1)//给出线程需要等待的条件{ try {System.out.printf(\靠边等\,Thread.currentThread().getName()); wait();//线程进入等待状态System.out.printf(\结束等待\,Thread.currentThread().getName()); }catch(InterruptedException e){} }fiveNumber=fiveNumber-1; tenNumber=tenNumber-1;twentyNumber=twentyNumber+1;System.out.printf(\给我20元钱,找您一张5元和一张10元,这是您的1张入场券\,Thread.currentThread().getName()); }else if(receiveMoney==20buyNumber==2) {while(tenNumber1)//给出线程等待的条件{try {System.out.printf(\靠边等\\n\,Thread.currentThread().getName()); wait();//线程进入的等待状态System.out.printf(\结束等待\,Thread.currentThread().getName()); }catch(InterruptedException e){} }tenNumber=tenNumber-1;twentyNumber=twentyNumber+1;System.out.printf(\给我20元钱,找您一张10元,这是您的2张入场券\,Thread.currentThread().getName()); }notifyAll();//通知等待的线程结束等待} }class Cinema implements Runnable {Thread zhao,qian,sun,li,zhou; TicketSeller seller; Cinema() {zhao=new Thread(this); qian=new Thread(this); sun=new Thread(this); li=new Thread(this); zhou=new Thread(this); zhao.setName(\赵\); qian.setName(\钱\); sun.setName(\孙\); li.setName(\李\); zhou.setName(\周\);seller=new TicketSeller(); }public void run() {if(Thread.currentThread()==zhao) seller.sellTicket(20,2);else if(Thread.currentThread()==qian) seller.sellTicket(20,1);else if(Thread.currentThread()==sun) seller.sellTicket(10,1);else if(Thread.currentThread()==li) seller.sellTicket(10,2);else if(Thread.currentThread()==zhou) seller.sellTicket(5,1); } }public class SaleExample {public static void main(String args[]) {Cinema cinema=new Cinema(); cinema.zhao.start(); try {Thread.sleep(1000); }catch(InterruptedException e){} cinema.qian.start(); try {Thread.sleep(1000); }catch(InterruptedException e){} cinema.sun.start(); try {Thread.sleep(1000); }catch(InterruptedException e){} cinema.li.start(); try {Thread.sleep(1000); }catch(InterruptedException e){}cinema.zhou.start(); } }实验截图:二、实验体会:对于实验“吵醒睡眠的线程”,让我更熟悉了interrupt()方法的使用,interrupt()方法常用来“吵醒”休眠的线程。
Java程序设计课件:线程

sleep(int millsecond) join(long millis)
使线程休眠一段时间,时间长短由参数 millsecond决定,单位是毫秒。
等待该线程终止。等待该线程终止的时间最长
为 millis 毫秒。
10/35 2023/12/28
1 线程的启动
创建线程对象T t.start(); // 线程启动
时交出对象锁,从而其他线程就可以取得对 象锁。还可以使用如下格式指定线程的等待 时间。
wait(long timeout) wait(long timeout,int nanos)
notifyAll()方法 notify()方法
14/35 2023/12/28
线程组
线程组(Thread Group):是包括许多线程的对象 集,线程组拥有一个名字以及与它相关的一些属性, 可以用于管理一组线程。
11/35 2023/12/28
线程的调度
Java的线程调度策略:
多线程系统会自动为每个线程分配一个优先级,默认 时,继承父类的优先级。
优先级高的线程先执行,优先级低的线程后执行。 任务紧急的线程,其优先级较高。 优先级相同的线程,按先进先出的原则排队运行。 线程的优先级分为10级,在线程类Thread中,Java
对象锁:Java运行系统在执行具有保留字 synchronized声明的方法时,会为每个处于临界区 的对象分配唯一的对象锁。任何线程访问一个对象中 被同步的方法前,首先要取得该对象的对象锁;同步 方法执行完毕后,线程会释放对象的同步锁。
13/35 2023/12/28
线程间的通信
wait()方法: 方法wait()使得当前进程处于阻塞状态,同
3)该线程与另一个线程join在一起。
Java程序设计案例教程(第二版)周怡、张英主编。第7章习题参考答案

第7章包与异常处理习题参考答案:一、判断题1.在编程中,可以不用进行异常的处理,因为有时发生的异常并不会影响程序的正常运行_____×__。
2.异常处理一般可用try ……catch语句进行处理的____√___。
3.try ……catch语句不能进行嵌套使用_×______。
4.如果觉得系统给出的异常类不够使用,也可能定义自己的异常类,自己定义的异常类一般继承Exception类(或其子类)___√____。
5.try……catch……finally语句中,三个关键字必须同时使用,才能达到异常处理的效果_____×__。
6.使用import 导入一包时,可以将这个包的子包也一并导入__×_____。
二、选择题1.异常是指___D____。
A.程序中的语法错误B.程序的编译错误C.程序执行过程中遇到的事先没有预料到的情况D.程序执行过程中遇到的事先没有预料到的情况,或程序事先定义好的可能出现的意外情况2.如果一个程序中有多个catch语句,程序会__C_____。
A.每个catch都会执行一次B.把每个符合条件的catch语句都执行一次C.找到适合的异常类型后就不再执行其它catch语句D.找到适合的异常类型后还要执行其它catch语句3.下列关于finally说法正确的是__C_____。
A.finally语句应该放在所有catch语句的前面B.finally语句应该放在所有catch语句的后面C.无论程序是否找到合适的catch匹配,都会去执行finallyD.如果程序在前面找到了多个适合的catch匹配,就不再执行finally语句了4.在一个方法内抛出异常时,应该使用下列哪个子句____A___。
A. throwB. catchC. finallyD. throws5.下列描述中,错误的一个是____B___。
A. 异常抛出点后的代码在抛出异常后不再执行B. 一个try代码段后只能跟有一个catch代码段C. try 一般要和catch联合使用D. 在编写程序过程中,要考虑对异常的处理6.一个catch语句段一定要和下列哪一项配合使用__A_____。
Java多线程技术PPT课件

❖ public Thread(Runnable target) ❖ public Thread(String name)
9
2. 如何实现多线程? 2.1 Thread类和Runnable接口
Thread类有3个有关线程优先级的常量:
❖ Thread.MIN_PRIORITY=1; ❖ Thread.MAX_PRIORITY=10; ❖ Thread.NORM_PRIORITY=5;
学习提纲
1
1. 程序、进程和线程 1.1 程序、进程和线程
程 序 ( Program ) 是能完成预定功能的静 态的指令序列。
2
பைடு நூலகம்
1. 程序、进程和线程 1.1 程序、进程和线程
为提高操作系统的并行性和资源利用率,提出了进程(Process)的概 念。简单地说进程是程序的一次执行,进程是动态的。
为解决此问题,又提出了线程(Thread)的概念。将资源分配和处理器 调度的基本单位分离,进程只是资源分配的单位,线程是处理器调度的 基本单位。一个进程包含多个并发的线程。一个进程中的线程只能使用进
程的资源和环境。线程只包含程序计数器、栈指针及堆栈,不包含进程地址
空 间 的 代 码 和 数 据 , 因 此 线 程 被 称 为 轻 质 进 程 ( Light Weight Process)。线程提高了系统的整体性能和效率。
正在执行的线程休眠(暂停执行)。
11
2. 如何实现多线程? 2.1 Thread类和Runnable接口
Runnable接口在ng包中,定义如下:
❖ public interface Runnable
Runnable接口中只包含一个抽象方法:
面向对象程序设计(Java)实验指导书

10 信息管理与信息系统 专业
雷金娥编 2012 年 9 月
目录
实验一 Java Application 程序的编辑、编译和运行 ..................................... 2 实验二 Java 程序设计基础.................................................................................. 4 实验三 类的封装 ................................................................................................... 5 实验四 类的继承 ..................................................................................................... 6 实验五 类的多态 ..................................................................................................... 8 实验六 接口与实现接口的类 ............................................................................. 12 实验七 图形用户界面设计 ................................................................................. 14 实验八 线程设计 ................................................................................................. 16 实验九 输入/输出流与文件操作......................................................................... 18 实验十 数据库应用设计 ..................................................................................... 20
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java与面向对象程序设计实验教程第7章 线程
content
7.1 多线程基础 7.2 线程的生命周期 7.3 生产者与消费者问题
实验:多线程
面向对象的程序设计
对外经济贸易大学 雷擎
7.1 多线程基础
7.1.1 线程的概念 7.1.2 Thread类和Runnable接口 7.1.3 在程序中实现多线程
aS[0] = "aaa"; aS[1] = new String("bbb"); aS[3] = new String("ccc");
for(k=0;k<5;k++) { aC[k] = new Circle(); }
面向对象的程序设计
对外经济贸易大学 雷擎
public void run()
{
try { System.out.println(Thread.currentThread().get Name()+ " going to sleep for " + sleepTime); //区别: 因为不是继承Thread类,因而必须先调用 currentThread方法
线程本身的数据通常只有寄存器数据,以及一 个程序执行时使用的堆栈,所以线程的切换比 进程切换的负担要小。
多线程是Java的内嵌特性,Java 虚拟机 允许应用程序并发地运行多个执行线程。
面向对象的程序设计
对外经济贸易大学 雷擎
7.1.2 Thread类和Runnable接
Java中实现多线程有两种途径:继承Thread 类或者实现Runnable接口。Thread类实现 Runnable接口。
面向对象的程序设计
对外经济贸易大学 雷擎
数组元素初始化的例子
int[] aI; aI=new int[10]; String[] aS; aS=new String[3]; Circle aC[]; aC=new Circle[5];
int k =0 ; for(k=0;k<10;k++) { aI[k] = k*k; }
程
面向对象的程序设计
对外经济贸易大学 雷擎
7.1.3 在程序中实现多线程
一个龟兔赛跑的例子,使用线程模拟了龟兔 在1000米赛跑过程。
面向对象的程序设计
对外经济贸易大学 雷擎
1.定义一个Thread类的子类
class Runner extends Thread { String name; double distance; Random rand = new Random();
tortoise.start();// 启动线程1
}
}
面向对象的程序设计
对外经济贸易大学 雷擎
2.实现Runnable接口
class JumpBean implements Runnable { private int sleepTime;
public JumpBean()//构造方法 {
sleepTime = (int) (Math.random() * 6000);//获得随机休息毫秒数 }
Runner tortoise = new Runner(“tortoise”); rabbit.setPriority(Thread.NORM_PRIORITY);
tortoise.setPriority(Thread.NORM_PRIORITY+5 );
rabbit.start();// 启动线程1
对外经济贸易大学 雷擎
使用定义好的Runner线程
import java.util.Random;
public class DemoThreadSimple {
public static void main(String[] args) {
//
创建并命名每个线程
Runner rabbit = new Runner("rabbit");
程
面向对象的程序设计
对外经济贸易大学 雷擎
实现Runnable接口
步骤:
1. 定义一个类,实现Runnalbe接口,并 override run()方法,在这个方法里是你希 望这个线程运行的代码
2. 创建一个这个新类的对象 3. 创建一个Thread类的对象,用刚才的
Runnable对象作为构造函数参数 4. 调用Thread对象的start()方法来启动线
distance + "米\t休息" + sleepTime + "毫秒"); try { Thread.sleep(sleepTime); } catch (InterruptedException inte) { }
} System.out.println(name+"跑到了终点"); } }
面向对象的程序设计
上述两种方法中都可用类Thread产生线程的对 象 Thread newthread;
面向对象的程序设计
对外经济贸易大学 雷擎
定义一个Thread类的子类
步骤:
1. 定义一个Thread类的子类,并override run()方法,在这个方法里是你希望这个线程 运行的代码
2. 创建一个这个新类的对象 3. 调用Thread对象的start()方法来启动线
public Runner(String name){ = name;
}面向对象的程序设计来自对外经济贸易大学 雷擎
public void run() { distance = 0.0; for (int i = 0; i < 10; i++) { distance += 100.0; int sleepTime = rand.nextInt(2000); System.out.println(name +"跑了"+
面向对象的程序设计
对外经济贸易大学 雷擎
创建线程的方式
1. 继承类Thread public class mythread extends Thread{ }
2.实现Runnable接口 public class mythread extends SuperClass implements Runnable { }
面向对象的程序设计
对外经济贸易大学 雷擎
7.1.1 线程的概念
线程和进程都是指正在执行的程序代码,是 与计算机中的并发执行相关的概念。
通过操作系统的调度,多个进程和线程可以 同时、独立的执行。
面向对象的程序设计
对外经济贸易大学 雷擎
线程与进程的区别
线程与进程的区别:
多个进程的内部数据和状态都是完全独立的,而 多线程是共享一块内存空间和一组系统资源,有 可能互相影响.