java多线程题目_第1页
java多线程题目_第2页
java多线程题目_第3页
java多线程题目_第4页
java多线程题目_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java高级编程作业31、 当多个线程共享某个资源时,为了确保在任何时间点一个共享资源只被一个线程使用,避免造成数据的不一致,需要使用线程同步机制,线程同步有几种方式?分别如何实现?答:有两种方式:第一种方式:使用同步方法synchronized void methodA()第二种方式:使用同步代码块void methodA()synchronized2、以下是一个模拟订票业务的程序。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;i13;i+)try Thread.sleep(1000); catch (InterruptedException e) e.printStackTrace();chamber.push(i););/生产者线程的压入线程Thread t2 = new Thread(new Runnable()/ 匿名内部类public void run()for(int i=1;i13;i+)try Thread.sleep(1000); catch (InterruptedException e) e.printStackTrace();chamber.pop(););/消费者线程的射出线程t1.start();t2.start(); class Chamber List bullets;Chamber()bullets=new ArrayList();public synchronized void push(Integer i)if(bullets.size()=12)trythis.wait();catch(InterruptedException e)e.printStackTrace();bullets.add(i);System.out.println(放入第+i+枚子弹);this.notify();public synchronized void pop()if(bullets.size()=0)trythis.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论