第七章作业

1.选择提答案: 1A 2B 3C 4C 5A 6C
2.简答题
一个单CPU的机器,如何同时执行多个线程?请简述其原理

单CPU的计算机中,CPU同时只能执行一条指令,因此,在仅有一个CPU的计算机上不可能同时执行多个任务。而操作系统为了能提高程序的运行效率,将CPU的执行时间分成多个时间片,分配给不同的线程,当一个时间片执行完毕后,该线程就可能让出CPU使用权限交付给下一个时间片的其他线程执行。当然有可能相邻的时间片分配给同一线程。之所以表面上看是多个线程同时执行,是因为不同线程之间切换的时间非常短,也许仅仅是几毫秒,对普通人来说是难以感知的,这样就看似多个线程在同时执行了。
调用线程对象的start()方法会执行run()方法,为什么不能直接调用run()方法?

run()方法是调用实例方法,只有主线程会执行,而start()方法是启动线程
1
线程的生命周期包括几种状态,请描述每种状态的特征

任何线程一般都具有5种状态,即创建、就绪、运行、阻塞、终止状态。
1.创建状态
在程序中用构造方法创建了一个线程对象后,新的线程对象就处于创建状态,此时,它已经获取了相应的资源,但还没有处于可运行状态,这时可以通过Thread类的方法来设置线程对象的属性,如设置线程名(setName())、设置线程优先级(setPriority())等。
2.就绪状态
线程创建之后,就可以通过调用start()方法启动线程,即进入就绪状态。此时,线程将进入线程队列排队,等待CPU资源,这表明它已经具备了运行条件,在未获得CPU资源时,仍不能真正执行。举例来说,去医院看病,某主任的专家号每天只有20个,挂上号的病人还需在分诊处等待叫号。这里每个挂到专家号的病人可以看成一个就绪状态的线程。
3.运行状态
当就绪状态的线程获得CPU资源时,即可转入运行状态,执行的run()方法。对于只有一个CPU的机器而言,任何时刻只能有一个处于运行状态的线程占用CPU,即获得CPU资源。延续上面医院看病的例子,被叫到的病人才能真正就诊,而每个主任专家在一个时刻只能为一个病人看病。
4.阻塞状态
一个正在运行的线程因某种原因不能继承运行时,进入阻塞状态。阻塞状态是一种“不可运行”的状态,而处于这种状态的线程在得到一个特定的事件之后会转回可运行状态。举例来说,轮到小张看病了,医生为查明原因要求他去做个化验,医生得到化验结果后才能继续诊断,如果把医生给小张看病看作一个线程,该线程此时即处于阻塞状态。
可能使线程暂停执行的条件:
线程优先级比较低,因此它不能获得CPU资源。
使用sleep()方法使线程休眠。
通过调用wait()方法,使线程等待。
通过调用yield()方法,线程显式出让CPU控制权。
线程由于等待一个文件I/O事件被阻塞。

5.死亡状态
一个线程的run()方法运行完毕,线程则进入死亡状态。处于死亡状态的线程不具有继承运行的能力。

编写一个程序,创建两个线程对象,每个线程输出从1到5的数,要求线程类分别使用继承Thread类和实现Runnable接口两种方式创建
使用Thread类实现方式

public class demo1 {
public static void main(String[] args) {
//创建线程对象
Thread thread = new Thread();
//启用线程
thread.start();
}
}
//继承Thread类
class Thread extends Thread {

public void run() {
	for (int i = 1; i <= 5; i++) {
		System.out.println(Thread.currentThread().getName()+":"+i);
	}
}

}

使用Runnable接口实现方式

public class Runnable{
public static void main(String[] args) {
// 创建线程对象
Thread thread = new Thread(new Runnable());
//启动线程
thread.start();
}
}
//实现Runnable接口
class Runnable implements Runnable {

	public void run() {
		for (int i = 1; i <= 5; i++) {
			System.out.println(Thread.currentThread().getName() + ":" + i);
		}

	}

}

张三和他的妻子各拥有一张银行卡和存折,可以对同一个银行账户进行存取款的操作,现银行账户中余款未500元,每人各取五次,每次取款100元,在取款过程中存在网络延迟,现在使用多线程模拟这个过程
银行账户类

package demo7;

//银行账户类
public class demo2 {
private int balance = 500; // 余额

public int getBalance() {
	return balance;
}

public void setBalance(int balance) {
	this.balance = balance;
}

public void Withdrawal(int amount) {
	balance = balance - amount;
}

}

取款线程类

package demo7;

public class TestAccount implements Runnable {
private BankAccount bankaccount = new BankAccount();

public void run() {
	// TODO Auto-generated method stub
	for (int i = 0; i < 5; i++) {
		makeWithdrawal(100); // 取款
		if (bankaccount.getBalance() < 0) {
			System.out.println("账户透支了!");
		}
	}
}
private synchronized  void makeWithdrawal(int amt) {
	if (bankaccount.getBalance() >= amt) {
		System.out.println(Thread.currentThread().getName() + " 准备取款");
		try {
			Thread.sleep(500); // 0.5秒后实现取款
		} catch (InterruptedException ex) {
		}
		// 如果余额足够,则取款
		bankaccount.Withdrawal(amt);
		System.out.println(Thread.currentThread().getName() + " 完成取款");
	} else {
		// 余额不足给出提示
		System.out.println("余额不足以支付" + Thread.currentThread().getName()
				+ " 的取款,余额为 " + bankaccount.getBalance());
	}
}

}

测试取款类

package demo7;

public class Test {
public static void main(String[] args) {
TestAccount testAccount = new TestAccount();
Thread t1 = new Thread(testAccount,“张三”);
Thread t2 = new Thread(testAccount,“张三的妻子”);
//启动线程
t1.start();
t2.start();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值