• 那是从何处传来的钟声呢?偶尔听到那钟声,平添一份喜悦与向往之情。

java线程同步习题

后端 Nanait 7年前 (2012-08-07) 90次浏览 已收录 0个评论 扫描二维码

题目

下列代码用线程演示 个线程的同步:按 t1-t2-t3 这一特定次序依次输出。每个线程每轮只能输出一个数组元素。

  1. class MySignal {
  2.     int data = 0;
  3.     public void setData(int x, int y) { // 当 data 值为 x 时运行,之后将其改为 y
  4.         /* 请补充完整,使之能得到期望的结果 */
  5.     }
  6. }
  7. class T implements Runnable {
  8.     private Thread t;
  9.     private MySignal flagData;
  10.     private int runFlag, nextFlag;
  11.     // 当 flagData 中的 data 值为 runFlag 时运行,之后将其改为 nextFlag
  12.     private char[] outputData;
  13.     public void start() {
  14.         t.start();
  15.     }
  16.     public T(MySignal d, char[] outPt, int x, int y) {
  17.         flagData = d;
  18.         outputData = outPt;
  19.         t = new Thread(this);
  20.         runFlag = x;
  21.         nextFlag = y;
  22.     }
  23.     public void run() {
  24.         /* 请补充完整,使之能得到期望的结果 */
  25.     }
  26. }
  27. class App {
  28.     public static void main(String[] args) {
  29.         MySignal data = new MySignal();
  30.         T t1, t2, t3;
  31.         char[] c1 = { ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘ };
  32.         char[] c2 = { ‘A’, ‘B’, ‘C’, ‘D’, ‘E’ };
  33.         char[] c3 = { ‘甲’, ‘乙’, ‘丙’, ‘丁’, ‘戊’ };
  34.         t1 = new T(data, c1, 01);
  35.         t2 = new T(data, c2, 12);
  36.         t3 = new T(data, c3, 20);
  37.         t1.start();
  38.         t2.start();
  39.         t3.start();
  40.     }
  41. }

输出结果为:

1 A 甲 2 B 乙 3 C 丙 4 D 丁 5 E 

参考代码如下

  1. /*
  2.  *
  3.  * @author Yanzh
  4.  *
  5.  */
  6. /*
  7.  * 输出结果为:
  8.    1 A 甲 2 B 乙 3 C 丙 4 D 丁 5 E 戊
  9.  */
  10. class MySignal{
  11.     int data=0;
  12.     public void setData(int x, int y){ //当 data 值为 x 时运行,之后将其改为 y
  13.         if(data==x) {
  14.             x=y;
  15.         }
  16.         /* 请补充完整,使之能得到期望的结果 */
  17.     }
  18. }
  19. class T implements Runnable{
  20.     private Thread t;
  21.     private MySignal flagData;
  22.     private int runFlag, nextFlag;
  23.     //当 flagData 中的 data 值为 runFlag 时运行,之后将其改为 nextFlag
  24.     private char[] outputData;
  25.     public void start(){ t.start(); }
  26.     public T(MySignal d, char[] outPt,int x, int y){
  27.         flagData=d;
  28.         outputData=outPt;
  29.         t=new Thread(this);
  30.         runFlag=x;
  31.         nextFlag=y;
  32.     }
  33.     public void run(){
  34.      /* 请补充完整,使之能得到期望的结果 */
  35.         for(int i=0;i<5;i++) {
  36.             synchronized (flagData) {
  37.                 while(flagData.data!=runFlag) {
  38.                     try {
  39.                         flagData.wait();
  40.                     } catch (InterruptedException e) {
  41.                         // TODO Auto-generated catch block
  42.                         e.printStackTrace();
  43.                     }
  44.                 }
  45.                 System.out.print(outputData[i]+” “);
  46.                 flagData.notifyAll();
  47.                 flagData.data=nextFlag;
  48.             }
  49.         }
  50.     }
  51. }
  52. class App{
  53.     public static void main (String[] args) {
  54.         MySignal data=new MySignal();
  55.         T t1,t2,t3;
  56.         char []c1={‘1‘,’2‘,’3‘,’4‘,’5‘};
  57.         char []c2={‘A’,’B’,’C’,’D’,’E’};
  58.         char []c3={‘甲’,’乙’,’丙’,’丁’,’戊’};
  59.         t1=new T(data,c1,0,1);
  60.         t2=new T(data,c2,1,2);
  61.         t3=new T(data,c3,2,0);
  62.         t1.start();
  63.         t2.start();
  64.         t3.start();
  65.     }
  66. }

何处钟 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:java 线程同步习题
喜欢 (0)
[15211539367@163.com]
分享 (0)

您必须 登录 才能发表评论!