java线程同步习题

avatar 2017年05月29日16:02:17 0 2040 views
博主分享免费Java教学视频,B站账号:Java刘哥
题目
下列代码用线程演示 3 个线程的同步:按 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. }
本文链接:https://liuyanzhao.com/4491.html
  • 微信
  • 交流学习,有偿服务
  • weinxin
  • 博客/Java交流群
  • 资源分享,问题解决,技术交流。群号:590480292
  • weinxin
avatar

发表评论

avatar 登录者:匿名
匿名评论,评论回复后会有邮件通知

  

已通过评论:0   待审核评论数:0