在程序中,DataPool是一个数据池,能存放一个血型数据,线程a和线程b负责向其中存放数据,一次只能有一个线程向其中存放数据,数据放入DataPool以后,该线程随机休眠一段时间,让另外一个线程运行,请将程序补充完整。 注意:请勿修改main()主方法和其他已有语句内容,仅在横线处填入适当语句。 class PutData extends Thread { DataPool s; int c; String name; public PutData(DataPool s,String name) {this.s=s;this.name=name; } public void run() {for(int i=0;i<10000000;i++){ c=(int)(Math.random()*10); s.setData(c); System.out.println(name+":push"+c); try { ______((int) (Math.random()*1000));//休眠 } catch(InterruptedException e) {}} } } class DataPool { private int data=0; public ______void setData(int d) {data=d; } } public class simple { public static void main(String[] args) {DataPool s=new DataPool();PutData a=new PutData(s,"Thread a");PutData b=new PutData(s,"Thread b");a.start();b.start(); } }
参考答案:
解析:sleep synchronized[讲解] 本题考查知识点:线程的要领和使用、线程的同步和共享。解题思路:线程类Thread提供了一系列控制线程的方法,让线程休眠,就是其中的一种。本题中定义了PutData的两个实例a和b。PutData的run方法中,利用一个循环向DataPool中存放10000000个随机数据,每存放一个数据以后休眠一段时间,让其他线程运行。第1个空,让线程休眠使用的方法是 sleep()。该方法使线程暂停运行一段时间,在这段时间内线程不会抢占CPU资源,为其他线程的运行提供了机会。本题的第2个空是考查线程的同步和互斥的问题,当线程A和线程B都调用setData方法改变data数值时,在同一段时间内,只能允许一个线程进行操作,这就需要两个线程之间互斥访问setData()方法。synchronized允许线程独占地存取对象,当 synchronized声明的程序块已经被一个线程占用,其他线程就必须等待该线程放弃这个程序块的控制权以后才能对其进行访问。因此,第2个空需要填写synchronized。