多线程异常处理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四多线程异常处理
1.实验目的
(1) 掌握Java的异常处理机制及相关实现方法能够在程序设计中熟练运用异常及相关类及对象;
(2) 掌握Java多线程的概念和实现方法;
(3) 掌握Java多线程的同步问题;
2.实验内容
实验题1创建两个线程,一个线程打印“A”,另一个线程打印“B”,比如ABBABAABBA….
实验代码:
package xuguigui;
public class SimpleThread extends Thread{
public SimpleThread(String name)
{
setName(name);
}
public void run(){
int i=0;
while(i++ <5){
try{
System.out.print(getName()+" ");
//Thread.sleep(1000);
}
catch(Exception e){
e.printStackTrace();
}
}
}
}
package xuguigui;
public class Xu {
public static void main(String[] args) {
SimpleThread thread1=new SimpleThread("A");
SimpleThread thread2=new SimpleThread("B");
thread1.start();
thread2.start();
}
}
程序运行结果:
实验题 2假设有火车票1000张,创建10个线程模拟10个售票点,每个售票点100毫秒买一张票。打印出售票过程,注意使用synchronized确保同一张票只能卖出一次。输出格式如下:
第4售票点卖出第100张票
第2售票点卖出第101张票……
程序代码:
package xx;
public class testxx extends Thread {
int ticket = 200;
String name = "";
public void run() {
while (true) {
synchronized (name) {
if (ticket <= 0)
break;
System.out.println("第" +
Thread.currentThread().getName()
+ "售票点卖出第" + ticket-- + "张票");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
package xx;
public class Ticket {
public static void main(String[] args){
testxx t = new testxx();
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();
}
}
程序运行结果:
此题主要考察synchronized()同步代码块的理解和使用。在程序中执行到synchronized设定的同步化区块时锁定当前对象,这样就没有其他线程可以执行这个被同步化的区块了。另,代码中调用了Thread类中的currentThread()方法,返回对当前正在执行的线程对象的引用。
实验题3 假设某家银行,它可接受顾客的汇款,每做一次汇款,便可计算出汇款的总额。现有两个顾客,每人都分3次,每次100元将钱到入。试编写一个程序,模拟实际作业。程序如下:
class CBank
{ private static int sum=0;
public static void add(int n){
int tmp=sum;
tmp=tmp+n; // 累加汇款总额
try{
Thread.sleep((int)(10000*Math.random())); // 小睡几秒钟
}
catch(InterruptedException e){}
sum=tmp;
System.out.println("sum= "+sum);
}
}
class CCustomer extends Thread // CCustomer类,继承自Thread类
{ public void run(){ // run() method
for(int i=1;i<=3;i++)
CBank.add(100); // 将100元分三次汇入
}
}
public class Ex6_1
{ public static void main(String args[])
{ CCustomer c1=new CCustomer();
CCustomer c2=new CCustomer();
c1.start(); c2.start();
}
}
[基本要求] 运行程序5次,观察每次运行结果是否相同。
[思考问题] 程序运行结果每次是否相同,运行时间是否相同,为什么?
①要使程序运行结果每次相同,应该怎样修改程序?
将睡眠时间由原来的随机改成一个确定的毫秒数,比如sleep(100),则运行结果和运行时间就一样了。