java实验14 多线程1 - 答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档