您现在的位置是:首页 > 正文

多线程作业及答案

2024-01-30 22:41:51阅读 0

多线程作业

一、填空题
1.处于运行状态的线程在某些情况下,如执行了sleep(睡眠)方法,或等待I/O设备等资源,将让出CPU并暂时停止自己的运行,进入_________状态。
2.处于新建状态的线程被启动后,将进入线程队列排队等待CPU,此时它已具备了运行条件,一旦轮到享用CPU资源就可以获得执行机会。上述线程是处于 状态。
3.一个正在执行的线程可能被人为地中断,让出CPU的使用权,暂时中止自己的执行,进入 状态。
4.在Java中编写实现多线程应用有两种途径:一种是继承Thread类创建线程,另一种是实现 接口创建线程。
5.在线程控制中,可以调用______________方法,阻塞当前正在执行的线程,等插队线程执行完后后再执行阻塞线程。
6.多线程访问某个共享资源可能出现线程安全问题,此时可以使用________________关键字来实现线程同步,从而避免安全问题出现,但会影响性能,甚至出现死锁。
7. 在线程通信中,调用wait( )可以是当前线程处于等待状态,而为了唤醒一个等待的线程,需要调用的方法是______________。
8.在线程通信中,可以调用wait()、notify()、notifyAll()三个方法实现线程通信,这三个方法都是______________类提供的public方法,所以任何类都具有这三个方法。

二、选择题

  1. 下列关于Java线程的说法正确的是( )。(选择一项)

    A 每一个Java线程可以看成由代码、一个真实的CPU以及数据三部分组成
    B. 创建线程的两种方法中,从Thread类中继承方式可以防止出现多父类的问题
    C. Thread类属于java.util程序包
    D. 使用new Thread(new X()).run();方法启动一个线程

  2. 以下选项中可以填写到横线处,让代码正确编译和运行的是( )。(选择一项)
    public class Test implements Runnable {
    public static void main(String[] args) {
    ___________________________________
    t.start();
    System.out.println(“main”);
    }
    public void run() {
    System.out.println(“thread1!”);
    }
    }

    A. Thread t = new Thread(new Test());
    B. Test t = new Test();
    C. Thread t = new Test();
    D. Thread t = new Thread();

  3. 如下代码创建一个新线程并启动线程,问:四个选项中可以保证正确代码创建target对象,并能编译正确的是( )?(选择一项)
    public static void main(String[] args) {
    Runnable target=new MyRunnable( );
    Thread myThread=new Thread(target);
    }

    A public class MyRunnable extends Runnable {
    public void run( ) { }
    }
    B. public class MyRunnable extends Runnable {
    void run( ) { }
    }
    C. public class MyRunnable implements Runnable {
    public void run( ) { }
    }
    D. public class MyRunnable implements Runnable {
    void run( ) { }

  4. 当线程调用start( )后,其所处状态为( )。(选择一项)

    A 阻塞状态
    B. 运行状态
    C. 就绪状态
    D. 新建状态

  5. 下列关于Thread类提供的线程控制方法的说法中,错误的是( )。(选择一项)

    A 线程A中执行线程B的join()方法,则线程A等待直到B执行完成
    B. 线程A通过调用interrupt()方法来中断其阻塞状态
    C. 若线程A调用方法isAlive()返回值为false,则说明A正在执行中,也可能是可运行状态
    D. currentThread()方法返回当前线程的引用

  6. 下列关于线程的优先级说法中,正确的是( )。(选择两项)

    A 线程的优先级是不能改变的
    B. 线程的优先级是在创建线程时设置的
    C. 在创建线程后的任何时候都可以重新设置
    D. 线程的优先级的范围在1-100之间

  7. 以下选项中关于Java中线程控制方法的说法正确的是( )。(选择二项)

    A. join ( ) 的作用是阻塞指定线程等到另一个线程完成以后再继续执行
    B. sleep ( ) 的作用是让当前正在执行线程暂停,线程将转入就绪状态
    C. yield ( ) 的作用是使线程停止运行一段时间,将处于阻塞状态
    D. setDaemon( )的作用是将指定的线程设置成后台线程

  8. 在多个线程访问同一个资源时,可以使用( )关键字来实现线程同步,保证对资源安全访问。(选择一项)

    A. synchronized
    B. transient
    C. static
    D. yield

  9. Java中线程安全问题是通过关键字( )解决的?。(选择一项)

    A. finally
    B. wait( )
    C. synchronized
    D. notify( )

  10. 以下说法中关于线程通信的说法错误的是( )?。(选择一项)

    A. 可以调用wait()、notify()、notifyAll()三个方法实现线程通信
    B. wait()、notify()、notifyAll()必须在synchronized方法或者代码块中使用
    C. wait()有多个重载的方法,可以指定等待的时间
    D. wait()、notify()、notifyAll()是Object类提供的方法,子类可以重写

三、判断题
1.进程是线程Thread内部的一个执行单元,它是程序中一个单一顺序控制流程。( )
2.Thread类实现了Runnable接口。( )
3.一个进程可以包括多个线程。两者的一个主要区别是:线程是资源分配的单位,而进程CPU调度和执行的单位。( )
4.用new关键字建立一个线程对象后,该线程对象就处于新生状态。处于新生状态的线程有自己的内存空间,通过调用start进入就绪状态。( )
5.A线程的优先级是10,B线程的优先级是1,那么当进行调度时一定会先调用A( )
6.线程可以用yield使低优先级的线程运行。( )
7.Thread.sleep( )方法调用后,当等待时间未到,该线程所处状态为阻塞状态。当等待时间已到,该线程所处状态为运行状态。( )
8.当一个线程进入一个对象的一个synchronized方法后,其它线程不可以再进入该对象同步的其它方法执行。( )
9.wait方法被调用时,所在线程是会释放所持有的锁资源。 sleep方法不会释放。( )
10.wait、notify、notifyAll是在Object类中定义的方法。( )
11.notify是唤醒所在对象wait pool中的第一个线程。( )

四、简答题
1.简述程序、进程和线程的联系和区别。
2.创建线程的两种方式分别是什么?各有什么优缺点。
3.sleep、yield、join方法的区别?
4.synchronize修饰的语句块,如下面的代码。是表示该代码块运行时必须获得account对象的锁。如果没有获得,会有什么情况发生?
synchronized (account) {
if(account.money-drawingNum<0){
return;
}
}

5.请你简述sleep( )和wait( )有什么区别?
6.死锁是怎么造成的?用文字表达。再写一个代码示例。
7.Java中实现线程通信的三个方法及其作用。
8.为什么不推荐使用stop和destroy方法来结束线程的运行?

五、编码题
1.设计一个多线程的程序如下:设计一个火车售票模拟程序。假如火车站要有100张火车票要卖出,现在有5个售票点同时售票,用5个线程模拟这5个售票点的售票情况。
2.编写两个线程,一个线程打印1-52的整数,另一个线程打印字母A-Z。打印顺序为12A34B56C….5152Z。即按照整数和字母的顺序从小到大打印,并且每打印两个整数后,打印一个字母,交替循环打印,直到打印到整数52和字母Z结束。
要求:
1)编写打印类Printer,声明私有属性index,初始值为1,用来表示是第几次打印。
2)在打印类Printer中编写打印数字的方法print(int i),3的倍数就使用wait()方法等待,否则就输出i,使用notifyAll()进行唤醒其它线程。
3)在打印类Printer中编写打印字母的方法print(char c),不是3的倍数就等待,否则就打印输出字母c,使用notifyAll()进行唤醒其它线程。
4)编写打印数字的线程NumberPrinter继承Thread类,声明私有属性private Printer p;在构造方法中进行赋值,实现父类的run方法,调用Printer类中的输出数字的方法。
5)编写打印字母的线程LetterPrinter继承Thread类,声明私有属性private Printer p;在构造方法中进行赋值,实现父类的run方法,调用Printer类中的输出字母的方法。
6)编写测试类Test,创建打印类对象,创建两个线程类对象,启动线程。

六、可选题
1.如何控制三个线程依次输出 1 2 3 4 5 6 …
2.如何控制两个线程 依次输出 1A2B3C4D…

多线程作业答案

一、填空题

1.阻塞
2.就绪
3.阻塞
4.Runnable
5.join()
6.synchronized
7.notify()
8.Object

二、选择题

1.A
2.A
3.C
4.C
5.C
6.BC
7.AD
8.A
9.C
10.D

三、判断题

1.×
2.√
3.×
4.√
5.×
6.×
7.×
8.√
9.√
10.√
11.×

四、简答题

答案略

五、编码题
1.设计一个多线程的程序如下:设计一个火车售票模拟程序。假如火车站要有100张火车票要卖出,现在有5个售票点同时售票,用5个线程模拟这5个售票点的售票情况。
线程类

public class SaleTicket implements Runnable {
	public int total = 100;// 总票数
	public int count = 0;// 票号
	public void run() {
		while (total > 0) {
			synchronized (this) {
				if (total > 0) {
					try {
						Thread.sleep(500);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					count++; // 票号++
					total--;// 总数减少
					// 输出当前的售票窗口和票号
					System.out.println(Thread.currentThread().getName()
							+ "\t当前票号:" + count);
				}
			}
		}
	}
}
测试类
public class Test {
	public static void main(String[] args) {
		// 创建线程类对象
		SaleTicket st = new SaleTicket();
		// 启动5次线程
		for (int i = 1; i <= 5; i++) {
			new Thread(st, "售票点" + i).start();
		}
	}
}

2.编写两个线程,一个线程打印1-52的整数,另一个线程打印字母A-Z。打印顺序为12A34B56C….5152Z。即按照整数和字母的顺序从小到大打印,并且每打印两个整数后,打印一个字母,交替循环打印,直到打印到整数52和字母Z结束。

打印类(共享资源)
public class Printer {
	private int index=1;//设为1,方便计算3的倍数	
	//打印数字的方法,每打印两个数字,等待打印一个字母
	public synchronized void print(int i){
		while(index%3==0){
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.print(""+i);
		index++;
		notifyAll();
	}
	//打印字母,每打印一个字母,等待打印两个数字
	public synchronized void print(char c){
		while(index%3!=0){
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.print(""+c);
		index++;
		notifyAll();
	}
}
打印字母线程
public class LetterPrinter extends Thread {
	private Printer p;
	public LetterPrinter(Printer p){
		this.p=p;
	}
	public void run(){
		for(char c='A';c<='Z';c++){
			p.print(c);
		}
	}
}
打印数字线程
 public class NumberPrinter extends Thread {
	private Printer p;
	public NumberPrinter(Printer p){
		this.p=p;
	}
	public void run(){
		for(int i=1;i<=52;i++){
			p.print(i);
		}
	}
}
测试类
public class Test {
	public static void main(String[] args) {
		Printer p=new Printer();     //创建打印机对象
		Thread t1=new NumberPrinter(p);  //创建线程对象
		Thread t2=new LetterPrinter(p); //创建线程对象
		t1.start();  //启动线程
		t2.start(); //启动线程
	}
}

六、可选题

网站文章

  • 【C/C++】内存管理(一):shared_ptr

    【C/C++】内存管理(一):shared_ptr

    智能指针是的一部分,这个头文件主要负责C++的动态内存管理。C++的动态内存管理是通过new/delete实现,这其实在使用的时候很麻烦。所谓智能指针其实是一些模板类,它们负责自动管理一个指针的内存,...

    2024-01-30 22:41:22
  • 最近,华为应用市场上线了一个服务

    最近,华为应用市场上线了一个服务

    阅读本文大概需要 2.2 分钟。华为应用市场 AppGallery Connect 服务 4 月 18 日正式上线,意在将华为在全球化、质量、安全、软件开发等领域长期构建...

    2024-01-30 22:41:14
  • 前端面试背背佳,背一背,面试效果更佳!

    前端面试背背佳,背一背,面试效果更佳!

    前端面试背背佳,背一背,面试效果更佳!

    2024-01-30 22:41:08
  • Redis7实战加面试题-高阶篇(手写Redis分布式锁)

    Redis7实战加面试题-高阶篇(手写Redis分布式锁)

    1.synchronized,单机版oK,上分布式死翘翘2.nginx分布式微服务单机锁不行3.取消单机锁,上redis分布式锁setnx只加了锁,没有释放锁,出异常的话,可能无法释放锁,必须要在代码...

    2024-01-30 22:41:00
  • 《麻省理工学院公开课:人工智能》笔记二

    《麻省理工学院公开课:人工智能》笔记二

    《03 推理:目标树与基于规则的专家系统》视频链接【Tips】首先解释一下什么是基于规则的专家系统?专家系统是人工智能的主要研究领域之一,是基于行业规则进行业务处理的计算机程序。这些规则来源于行业知识,用于描述特定条件下所要执行的动作,并且定义了相关动作对于数据的影响。因此,专家系统可以利用其推理能力得出结论或者执行相关分析任务。在专家系统中,解决问题所需的知识,作为一个规则集合存储在知识...

    2024-01-30 22:40:31
  • 在线点餐系统的测试用例

    在线点餐系统的测试用例

    2024-01-30 22:40:24
  • 谈谈我对MVC的理解

    谈谈我对MVC的理解

    看了Yii1.0的框架后 感觉还是对 MVC 挺模糊的 基础的使用还是分不清楚 写一下 加深一下印象 翻过其他道友的 CSDN 有些迷茫有看过 百度和 菜鸟 整合MVC全名是Model View Controller使用MVC的目的是将M和V的实现代码分离 从而使同一个程序可以使用不同的表现形式C存在的目的则是确保M和V的同步 一旦M改变 V应该同步更新模型-...

    2024-01-30 22:40:18
  • Redis源码篇

    Redis源码篇

    原理篇 字符串 Redis的字符串叫着&quot;SDS&quot;,也就是Simple Dynamic String,是一个带长度信息的字符数组。包含 struct SDS{ T capacity ...

    2024-01-30 22:39:49
  • 深入理解JVM:java对象的创建过程?

    深入理解JVM:java对象的创建过程?

    Step1:类加载检查 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先...

    2024-01-30 22:39:42
  • 敏捷软件开发 之 第6章《一次编程实践》读书笔记

    敏捷软件开发 之 第6章《一次编程实践》读书笔记

    3月箴言人的思想是了不起的,只要专注于某一项事业,就一定会做出使自己感到吃惊的成绩来。—— 马克·吐温本章是详细表述了一个保龄球记分功能的开发过程本章重要前提(也许我们中的大多数并不是很清楚保龄球的记分规则,而编写程序我认为最重要的的就是先理清规则):第一步:得知需求并分析需求;第二步:根据需求规则,写出基本测试用例(这个用例尚未添加任何逻辑);第三步:将规则中的...

    2024-01-30 22:39:34