问题 问答题

本题程序中实现了一个“生产者一消费者问题”。生产者产生一个随机数存入DataPool类中,消费者从中取出数据。DataPool类一次只能存放一个数据。请更正题中带下划线的部分。
注意:不改变程序的结构,不得增行或删行。
class DataPool

private int data;
private boolean isFull;
public DataPool()

isFull=false;

public synchronized void putData(int d)

if(isFull= =true)

try

this.notify();

catch(InterruptedException e)


data=d;
isFull=true;
System.out.println("生产了一个数据:"+data);
this.notify();

public synchronized int getData()

if(isFull= =false)

try

this.wait();

catch(InterruptedException e)


isFull=false;
System.out.println("消费了一个数据"+data);
this.wait();
return this.data;

boolean getIsFull()

return isFull;


class Producer extends Thread

DataPool pool;
public Producer(DataPool pool)

this.pool=pool;

public void run()

for(int i=0; i<10; i++)

int data=(int) (Math.random()*1000);
try
//用于生产数据
sleep(data);

catch(InterruptedException e)

pool.putData(data);



class Consumer implements Runnable

DataPool pool;
public Consumer(DataPool pool)

this.pool=pool;

public void run()

for(int i=0; i<10; i++)

int data=pool.getData();
try
//用于处理数据
sleep((int) (Math.random()*1000));

catch(InterruptedException e)




public class advance

public static void main(String[] args)

Data Pool pool=new Data Pool();
Producer pro=new Producer(pool);
Runnable con=new Consumer(pool);
Thread conTh=new Thread(con);
pro.start();
conTh.start();

答案

参考答案:this.wait()
this.notify()
thread.sleep((int)(Math.random()*1000))

解析:[讲解] 本题考查知识点:多线程同步与互斥、线程的概念和实现方法。解题思路:Data Pool是一个用来存放数据的缓冲池,其中可以存放一个血型数据,变量isFull作为标志量,标志该缓冲池中是否有数据。Put Data()方法负责向Data Pool中存放数据,本方法调用成功,缓冲池中就存入了数据,getData()方法负责从DataPool中获得数据,本方法调用成功,缓冲池就为空。Producer类负责产生随机数据,然后将数据存放到DataPool中。Consumer类负责才能够从DataPool中取出数据。Producer和Consumer共享同一个Data Pool对象。当某个线程进入synchronized块后,共享的数据并不一定能满足该线程的需要,这样线程就需要等待其他线程修改共享数据,直到满足需要以后才继续执行,但是当前线程必须释放锁以使得其他线程可以运行。wait()和notify()方法是实现线程之间通信的两个方法。wait()用来释放线程拥有的锁,使线程进入等待队列;notify()用来唤醒等待队列中的线程,并把它加入到申请锁的队列。本题中生产者在DataPool有数据的情况下需要进入等待消费者取出数据,所以需要调用wait()方法,因此第1个下划线的地方应该改为this.wait()。消费者线程在取出数据以后,必须通知生产者线程DataPool中已经没有数据了,因此第2个下划线的地方改为this.notify()。第3个下划线的地方,考查常用的线程类的使用。Runnable接口的目的是使任何类都可以为线程提供线程体,但它本身并不是线程,所以并不能直接调用Thread类的方法,需要改为 thread.sleep。

问答题
问答题 简答题

材料一古代丝绸之路始于张骞出使西域。公元前138年和公元前119年,张骞两次出使西域,它历史性地创建了一条由东亚至欧洲的陆上交通大动脉,将中国与中亚、西亚直至南欧的广大区域连接在一起。——《中国文化传媒网》2014年8月材料二永乐三年六月十五日,郑和开始了中国历史上最伟大的远航征程。当时世界上最强大的大明朝在拥有压倒性军事优势的情况下,能够平等对待那些小国,并尊重他们的主权和领土完整,给予而不是抢掠,是很不简单的。它不是武力的征服者,却用自己友好的行动真正征服了航海沿途几乎所有的国家。这种征服是心底的征服,它存在于每一个人的心中。当那浩浩荡荡的船队来到时,人们不会四处躲避,而是纷纷出来热烈欢迎这些远方而来的客人。——摘编自《明朝的那些事儿》材料三公元1500年前后的地理大发现,拉开了不同国家相互对话和相互竞争的历史大幕,由此,大国崛起的道路有了全球坐标——正是从那个时候起,割裂的世界开始连接在一起。经由地理大发现而引发的国家竞争,拉开了不同文明间的相互联系、相互注视,同时也相互对抗和争斗的历史大幕。——《大国崛起》材料四中国提出并推动“一带一路”建设,就是要弘扬古丝绸之路和平友好、开放包容的精神,探索新形势下国际经济合作与发展的新模式。特别是推动实现互联互通,为沿线国家加强经贸往来创造物质基础和便利条件,在平等、包容、合作、共赢的基础上续写共同发展的新篇章,最终形成互利共赢的利益共同体和共同发展繁荣的命运共同体。——人民日报热点辨析

(1)张骞出使西域发生在什么朝代?为加强对西域地区的管辖,当时的政府设置了一个什么机构?