题目
下列代码用线程演示 3 个线程的同步:按 t1-t2-t3 这一特定次序依次输出。每个线程每轮只能输出一个数组元素。
- class MySignal {
- int data = 0;
- public void setData(int x, int y) { // 当 data 值为 x 时运行,之后将其改为 y
- /* 请补充完整,使之能得到期望的结果 */
- }
- }
- class T implements Runnable {
- private Thread t;
- private MySignal flagData;
- private int runFlag, nextFlag;
- // 当 flagData 中的 data 值为 runFlag 时运行,之后将其改为 nextFlag
- private char[] outputData;
- public void start() {
- t.start();
- }
- public T(MySignal d, char[] outPt, int x, int y) {
- flagData = d;
- outputData = outPt;
- t = new Thread(this);
- runFlag = x;
- nextFlag = y;
- }
- public void run() {
- /* 请补充完整,使之能得到期望的结果 */
- }
- }
- class App {
- public static void main(String[] args) {
- MySignal data = new MySignal();
- T t1, t2, t3;
- char[] c1 = { ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘ };
- char[] c2 = { ‘A’, ‘B’, ‘C’, ‘D’, ‘E’ };
- char[] c3 = { ‘甲’, ‘乙’, ‘丙’, ‘丁’, ‘戊’ };
- t1 = new T(data, c1, 0, 1);
- t2 = new T(data, c2, 1, 2);
- t3 = new T(data, c3, 2, 0);
- t1.start();
- t2.start();
- t3.start();
- }
- }
输出结果为:
1 A 甲 2 B 乙 3 C 丙 4 D 丁 5 E 戊
参考代码如下
- /*
- *
- * @author Yanzh
- *
- */
- /*
- * 输出结果为:
- 1 A 甲 2 B 乙 3 C 丙 4 D 丁 5 E 戊
- */
- class MySignal{
- int data=0;
- public void setData(int x, int y){ //当 data 值为 x 时运行,之后将其改为 y
- if(data==x) {
- x=y;
- }
- /* 请补充完整,使之能得到期望的结果 */
- }
- }
- class T implements Runnable{
- private Thread t;
- private MySignal flagData;
- private int runFlag, nextFlag;
- //当 flagData 中的 data 值为 runFlag 时运行,之后将其改为 nextFlag
- private char[] outputData;
- public void start(){ t.start(); }
- public T(MySignal d, char[] outPt,int x, int y){
- flagData=d;
- outputData=outPt;
- t=new Thread(this);
- runFlag=x;
- nextFlag=y;
- }
- public void run(){
- /* 请补充完整,使之能得到期望的结果 */
- for(int i=0;i<5;i++) {
- synchronized (flagData) {
- while(flagData.data!=runFlag) {
- try {
- flagData.wait();
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- System.out.print(outputData[i]+” “);
- flagData.notifyAll();
- flagData.data=nextFlag;
- }
- }
- }
- }
- class App{
- public static void main (String[] args) {
- MySignal data=new MySignal();
- T t1,t2,t3;
- char []c1={‘1‘,’2‘,’3‘,’4‘,’5‘};
- char []c2={‘A’,’B’,’C’,’D’,’E’};
- char []c3={‘甲’,’乙’,’丙’,’丁’,’戊’};
- t1=new T(data,c1,0,1);
- t2=new T(data,c2,1,2);
- t3=new T(data,c3,2,0);
- t1.start();
- t2.start();
- t3.start();
- }
- }