java实验14 多线程1 - 答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验十四多线程(一)
一、实验时间:姓名:学号:
二、实验目的
1、了解线程的概念;
2、掌握通过Thread类创建线程;
3、掌握通过Runnable接口创建多线程;
4、掌握多线程的同步;
三、知识点
1、线程的概念;
2、通过Thread类创建线程;
3、通过Runnable接口创建多线程;
4、同步函数
四、实验内容与步骤
1、请思考并举例说明为何需要多线程,实现多线程的好处是什么?
2、编程实现以下功能:通过主线程控制另外两个线程,这两个线程分别在命令行窗口的左侧和右侧顺序地、一行一行地输出字符串。主线程负责判断输出的行数,当其中任何一个线程输出8行后就结束进程。
要求:分别使用Thread的子类和Runable接口创建线程。
1)使用Thread的子类完成
//主线程程序
public class Example8_3 {
public static void main(String[] args) {
Left left=new Left();
Right right=new Right();
left.start();
right.start();
while(true){
if(left.n==8||right.n==8){
System.exit(0);
}
}
public class Left extends Thread {
int n=0;
public void run(){
while(true){
n++;
System.out.printf("\n%s", "我在左面写字");
try{
sleep((int)(Math.random()*100)+100);
}
catch(InterruptedException e){}
}
}
}
//右边线程
public class Right extends Thread {
int n=0;
public void run(){
while(true){
n++;
System.out.printf("\n%40s", "我在右面写字");
try{
sleep((int)(Math.random()*100)+100);
}
catch(InterruptedException e){}
}
}
}
2)Runable接口创建线程
//主线程程序
public class Example8_4 {
public static void main(String[] args) {
Left1 l1=new Left1();
new Thread(l1).start();
Right1 r1=new Right1();
new Thread(r1).start();
while(true){
if(l1.n==8||r1.n==8){
System.exit(0);
}
}
public class Left1 implements Runnable {
int n=0;
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
n++;
System.out.printf("\n%s", "我在左面写字");
try{
Thread.sleep((int)(Math.random()*100)+100);
}
catch(InterruptedException e){}
}
}
}
//右边线程
public class Right1 implements Runnable{
int n=0;
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
n++;
System.out.printf("\n%40s", "我在右面写字");
try{
Thread.sleep((int)(Math.random()*100)+100);
}
catch(InterruptedException e){}
}
}
}
3、编程模拟四个售票进程共同出售100张火车票,要保证线程安全。public class ThreadTest implements Runnable {
private int tickets=100;
@Override
public void run() {
while(true)
sale();
}
public synchronized void sale(){
if(tickets>0){
System.out.println(Thread.currentThread().getName()+" is saling ticket "+tickets--);
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
// TODO Auto-generated method stube
ThreadTest t=new ThreadTest();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
}
4、创建两个线程:accountant和cashier,它们共同拥有一个账本。它们都可以使用saveOrTake(int number)对账本进行访问,会计使用saveOrTake()方法时,向账本上写入存钱记录;出纳使用saveOrTake()方法时,向账本写入取钱记录。因此,当会计正在使用saveOrTake()方法时,出纳被禁止使用,反之也是这样。比如,会计每次使用saveOrTake()方法时,在账本上存入90万元,在存入这笔钱时,分3次存完,每存入30万元,就休息一会儿,休息时出纳仍不能使用saveOrTake()方法。要保证其中一人使用saveOrTake()方法时,另一个人将必须等待。
//Bank.java
public class Bank implements Runnable {
int money=300;
String accountantName,cashierName;
public Bank(String s1,String s2){
accountantName=s1;
cashierName=s2;
}
public void run() {
// TODO Auto-generated method stub
saveOrTake(30);
}
public synchronized void saveOrTake(int number){
if(Thread.currentThread().getName().equals(accountantName)){ for(int i=1;i<=3;i++){
money=money+number;