java多线程题目

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1、当多个线程共享某个资源时,为了确保在任何时间点一个共享资源只被一个线程使用,避免造成数据的不一致,需要使用线程同步机制,线程同步有几种方式?分别如何实现?

答:有两种方式:

第一种方式:使用同步方法

synchronized void methodA(){}

第二种方式:使用同步代码块

void methodA(){

synchronized{

}

}

2、以下是一个模拟订票业务的程序。BookingClerk类代表自动售票员,其中包含一个订票(booking)方法。假设一开始有10张票可预定。程序运行时产生两个订票客户同时自动向自动售票员订票。请问会出现什么错误?该如何修改?

(考点:临界区与互斥)

public class Test {

public static void main(String args[]) {

BookingClerk bt = new BookingClerk();

new BookingTest(bt, 7);

new BookingTest(bt, 5);

}

}

class BookingClerk {

int remainder = 10;

void booking(int num) {

if (num <= remainder) {

System.out.println("预定" + num + "张票");

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

remainder = remainder - num;

} else {

System.out.println("剩余票不够,无法预定");

}

System.out.println("还剩"+remainder+"张票");

}

}

class BookingTest implements Runnable {

BookingClerk bt;

int num;

BookingTest(BookingClerk bt, int num) {

this.bt = bt;

this.num = num;

new Thread(this).start();

}

public void run() {

bt.booking(num);

}

}

答:问题:这样会出现数据可能变得不一致,且不一致的概率很高,这样是订票系统不稳定了,而且没有线程的同时访问的效果,而是就是一般的程序执行顺序,不符合实际。

应改为:

public class Test {

public static void main(String args[]) {

new Test().test();

}

public void test(){

BookingClerk bt = new BookingClerk();

Thread t1=new Thread(new BookingTest(bt, 7));

Thread t2=new Thread(new BookingTest(bt, 5));

t1.start();

t2.start();

}

}

class BookingClerk {

int remainder = 10;

synchronized void booking(int num) {

if (num <= remainder) {

System.out.println("预定" + num + "张票");

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

remainder = remainder - num;

} else {

System.out.println("剩余票不够,无法预定");

}

System.out.println("还剩"+remainder+"张票");

}

}

class BookingTest implements Runnable {

BookingClerk bt;

int num;

BookingTest(BookingClerk bt, int num) {

this.bt = bt;

this.num = num;

}

public void run() {

bt.booking(num);

}

}

3、采用Java 多线程技术,设计实现一个符合生产者和消费者问题的程序。对一个对象(枪膛)进行操作,其最大容量是12颗子弹。生产者线程是一个压入线程,它不断向枪膛中压入子弹;消费者线程是一个射出线程,它不断从枪膛中射出子弹。

要求:

(1)给出分析过程说明。

这是个生产者与消费者问题,也是线程的同步问题,

为了防止两个线程访问一个资源时出现忙等待,要使用的wait-notify函数,是两个线程交替执行;

(2)程序输出,要模拟体现对枪膛的压入和射出操作;

(2)设计程序时应考虑到两个线程的同步问题。

完成题目后参考并仔细分析以下代码

import java.util.ArrayList;

import java.util.List;

public class TestShuot {

public static void main(String[] args) {

new TestShuot().test();

}

public void test(){

final Chamber chamber=new Chamber();

Thread t1 = new Thread(new Runnable(){// 匿名内部类

public void run() {

for(int i=1;i<13;i++){

相关文档
最新文档