黑马程序员技术交流社区

标题: 让2个线程按顺序打印 [打印本页]

作者: 吴光新    时间: 2014-2-15 03:12
标题: 让2个线程按顺序打印
本帖最后由 吴光新 于 2014-2-15 03:16 编辑

public class Test1 {
private A a;
private B b;

public static void main(String[] args){
  Test1 t = new Test1();
  t.show();
}

public void show(){
  a = new A();
  b = new B();
  a.start();
  b.start();
}

class A extends Thread{
  @Override
  public void run() {
   for (int i = 1; i < 100; i+=2) {
    System.out.println("A=" + i);
   }
  }
}
class B extends Thread{
  @Override
  public void run() {
   for (int i = 0; i < 100; i+=2) {
    System.out.println("B=" + i);
   }
  }
}
}



打印结果是
A=1
A=3
A=5
B=0
A=7
A=9
A=11
A=13
....

请修改程序,让两个线程同时打印
A=1
B=2
A=3
B=4
A=5
B=6
......

回答正确,前三名 各奖励2技术分
作者: 小Zeor………    时间: 2014-2-15 08:35
本帖最后由 小Zeor……… 于 2014-2-15 10:27 编辑

抢沙发,应该是线程加锁的问题。占个位置一会贴出来解答,有技术分 ,哇咔咔
  1. public class Test1 {
  2.         private A a;
  3.         private B b;
  4.         private R r;

  5.         public static void main(String[] args) {
  6.                 Test1 t = new Test1();
  7.                 t.show();
  8.         }

  9.         public void show() {
  10.                 r = new R();
  11.                 a = new A();
  12.                 b = new B();
  13.                 Thread t1 = new Thread(a);
  14.                 Thread t2 = new Thread(b);
  15.                 t1.start();
  16.                 t2.start();
  17.         }

  18.         class R {
  19.                 boolean flag = true;
  20.         }

  21.         class A extends Thread {
  22.                 @Override
  23.                 public void run() {
  24.                         int i = 0;
  25.                         while (i < 100) {
  26.                                 {
  27.                                         if (r.flag) {
  28.                                                 synchronized(r){System.out.println("A=" + i);
  29.                                                 i++;
  30.                                                 i++;
  31.                                                 r.flag = false;
  32.                                                 }
  33.                                         }
  34.                                 }
  35.                         }
  36.                 }
  37.         }

  38.         class B extends Thread {
  39.                 @Override
  40.                 public void run() {
  41.                         int i = 1;
  42.                         while (i < 100) {
  43.                                 if (!r.flag) {
  44.                                         synchronized (r) {
  45.                                                 System.out.println("B=" + i);
  46.                                                 i++;
  47.                                                 i++;
  48.                                                 r.flag = true;
  49.                                         }
  50.                                 }

  51.                         }
  52.                 }
  53.         }
  54. }
复制代码



作者: 分解式    时间: 2014-2-15 09:05
求技术分
作者: 奋斗的小胖子    时间: 2014-2-15 09:17
本帖最后由 奋斗的小胖子 于 2014-2-15 09:44 编辑
  1. public class Test1
  2. {
  3.          public static void main(String[] args)
  4.          {
  5.                  show s1=new show();
  6.                  A a1=new A(s1);
  7.                  B b1=new B(s1);
  8.                  Thread t1=new Thread(a1);
  9.                  Thread t2=new Thread(b1);
  10.                  t1.start();
  11.                  t2.start();
  12.                  
  13.          }
  14.                
  15. }
  16.          
  17.          
  18. class show
  19. {
  20.         private show s;
  21.         int num=0;
  22.         private boolean flag=false;
  23.         show(){}
  24.         Lock lock=new ReentrantLock();
  25.         Condition  A_lock=lock.newCondition();
  26.         Condition  B_lock=lock.newCondition();
  27.         public void showA()
  28.         {
  29.                 lock.lock();
  30.                 try {
  31.                        
  32.                        
  33.                         while(flag==true)
  34.                         {
  35.                                 A_lock.await();
  36.                                 if(num<100)
  37.                                 {
  38.                                         num++;
  39.                                         System.out.println("A="+num);
  40.                                 }
  41.                         }
  42.                         flag=true;
  43.                         B_lock.signal();
  44.                 }
  45.                 catch (InterruptedException e) {
  46.                         // TODO Auto-generated catch block
  47.                         e.printStackTrace();
  48.                 }
  49.                 finally
  50.                 {
  51.                         lock.unlock();
  52.                 }
  53.         }

  54.         public void showB()
  55.         {
  56.                 lock.lock();
  57.                 try {
  58.                        
  59.                        
  60.                         while(flag==false)
  61.                         {
  62.                                 B_lock.await();
  63.                                 if(num<100)
  64.                                 {
  65.                                         num++;
  66.                                         System.out.println("B="+num);
  67.                                 }
  68.                         }
  69.                         flag=false;
  70.                         A_lock.signal();
  71.                 }
  72.                 catch (InterruptedException e) {
  73.                         // TODO Auto-generated catch block
  74.                         e.printStackTrace();
  75.                 }
  76.                 finally
  77.                 {
  78.                         lock.unlock();
  79.                 }
  80.         }
  81. }
  82. class A implements Runnable
  83. {
  84.         show s;
  85.         public A(show s)
  86.         {
  87.                 this.s=s;
  88.         }
  89.         public void run()
  90.         {
  91.                 while(true)
  92.                 {
  93.                         s.showA();
  94.                 }
  95.         }
  96. }
  97. class B implements Runnable
  98. {
  99.         show s;
  100.         public B(show s)
  101.         {
  102.                 this.s=s;
  103.         }
  104.         public void run()
  105.         {
  106.                 while(true)
  107.                 {
  108.                         s.showB();
  109.                 }
  110.         }
  111. }
复制代码

我是参考生产消费的例子写的,为了抢楼没写注释,就先发了
作者: LSCZ3633    时间: 2014-2-15 09:29
  1. package com.itheima;
  2. /*
  3. * 使两个线程一个一个有序进行
  4. *
  5. * 思路:定义一个标签boolean  判断哪个线程应该执行
  6. * 定义一个公共变量i
  7. * 加入一个同步代码块 synchronized(r)
  8. *
  9. *
  10. *
  11. * */


  12. public class Test1 {
  13. private A a;
  14. private B b;
  15. private R r;
  16. public static void main(String[] args){
  17.          
  18.     Test1 t = new Test1();
  19.    t.show();
  20. }

  21. public void show(){
  22.    r=new R();
  23.          a = new A(r);
  24.    b = new B(r);
  25.   
  26.    a.start();
  27.    b.start();
  28. }
  29. }
  30. class R{
  31.         int i=1;
  32.         boolean flag=true;
  33.        
  34.         R(){}
  35.        
  36. }
  37. class A extends Thread{
  38.          private R r;
  39.          A(R r){
  40.                  this.r=r;
  41.          }
  42.          @Override
  43.    public void run() {
  44.    
  45.                  for (; r.i < 100; ) {
  46.                          
  47.                          if(r.flag){
  48.                                  synchronized(r){
  49.                                          System.out.println("A=" + r.i++);
  50.                                          r.flag=false;
  51.                                  }
  52.                                  
  53.                                  }
  54.    
  55.      
  56.     }
  57.    }
  58. }

  59. class B extends Thread{
  60.          private R r;
  61.          B(R r){
  62.                  this.r=r;
  63.          }
  64.          @Override
  65.    public void run() {
  66.     for (; r.i < 100; ) {
  67.             if(!r.flag){
  68.                      synchronized(r){
  69.                     System.out.println("B=" + r.i++);
  70.                      r.flag=true;
  71.                      }
  72.             }
  73.    
  74.    
  75.     }
  76.    }
  77. }
复制代码

作者: LuckyQS    时间: 2014-2-15 09:45
public class Test1 {
        private A a;
        private B b;
        private R r;
        public static void main(String[] args){
                Test1 t = new Test1();
                t.show();
        }
        public void show(){
                r=new R();
                a = new A(r);
                b = new B(r);
                a.start();
                b.start();
        }
}
class R{
        int i=1;
        boolean flag=true;
        R(){}      
}
class A extends Thread{
        private R r;
        A(R r){
                this.r=r;
        }
        @Override
        public void run() {
                while(r.i<100) {   
                        if(r.flag){
                                synchronized(r){
                                        System.out.println("A="+r.i++);
                                        r.flag=false;
                                }                        
                        }
                }
        }
}
class B extends Thread{
        private R r;
        B(R r){
                this.r=r;
        }
        @Override
        public void run() {
        while(r.i<100) {
                if(!r.flag){
                        synchronized(r){
                                System.out.println("B="+r.i++);
                                r.flag=true;
                                }
                        }
                }
        }
}
只要让两个线程控制同一份元素,定义一个boolean变量来改变线程的执行权
作者: 倉促、尋找你    时间: 2014-2-15 09:47
手机回复,就不贴代码了,线程同步建议使用实现Runnable接口的方法去做这个题目不难,你搜一下资料应该就搞定了
作者: 孤独的天奇    时间: 2014-2-15 11:15
奋斗的小胖子 发表于 2014-2-15 09:17
我是参考生产消费的例子写的,为了抢楼没写注释,就先发了

嗯,我觉得,就应该是这样子。
作者: 孤独的天奇    时间: 2014-2-15 19:20
package com.itheima;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Resource {
       
        Lock lock = new ReentrantLock();
        boolean flag = false;
        Condition conditionA = lock.newCondition();
        Condition conditionB = lock.newCondition();
       
        public void printA(){
                lock.lock();
                try {
                        for (int i = 1; i <= 100; i+=2) {
                                while(flag)
                                        conditionA.await();
                            System.out.println("A=" + i);
                            flag = true;
                            conditionB.signal();
                           }
                } catch (Exception e) {
                        // TODO: handle exception
                }finally{
                        lock.unlock();
                }
               
        }
package com.itheima;

public class A implements Runnable{
       
        private Resource res;
       
        public A(Resource res){
                this.res = res;
        }

        @Override
        public void run() {
                res.printA();
               
        }
}

package com.itheima;

public class B implements Runnable {

        private Resource res;
       
        public B(Resource res){
                this.res = res;
        }
       
        @Override
        public void run() {
                res.printB();
        }

}

package com.itheima;

public class Test {

        /**
         * @param args
         */
        public static void main(String[] args) {
                Resource res = new Resource();
                new Thread(new A(res)).start();
                new Thread(new B(res)).start();

        }

}



作者: 孤独的天奇    时间: 2014-2-15 19:22
package com.itheima;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Resource {
       
        Lock lock = new ReentrantLock();
        boolean flag = false;
        Condition conditionA = lock.newCondition();
        Condition conditionB = lock.newCondition();
       
        public void printA(){
                lock.lock();
                try {
                        for (int i = 1; i <= 100; i+=2) {
                                while(flag)
                                        conditionA.await();
                            System.out.println("A=" + i);
                            flag = true;
                            conditionB.signal();
                           }
                } catch (Exception e) {
                        // TODO: handle exception
                }finally{
                        lock.unlock();
                }
               
        }
       
        public void printB(){
                lock.lock();
                try {
                        for (int i = 2; i <= 100; i += 2) {
                                while(!flag)
                                        conditionB.await();
                                System.out.println("B=" + i);
                                flag = false;
                            conditionA.signal();
                        }
                } catch (Exception e) {
                        lock.unlock();
                }
        }
}

Resource 类没有发全,补上
作者: 小Zeor………    时间: 2014-2-15 20:37
@吴光新 求加分。。。。要下一步考试。。
作者: 奋斗的小胖子    时间: 2014-2-19 20:06
QQ多少啊?  什么奖励啊?
作者: 奋斗的小胖子    时间: 2014-2-19 20:16
没有权限啊
作者: 奋斗的小胖子    时间: 2014-2-19 20:19


请修改我的权限

作者: wh963572516    时间: 2014-2-21 15:45
自己写的,不知道对不对,我自己验证的是和你要求的一样
  1. //公共资源
  2. class Resource
  3. {
  4.         public int i = 1;
  5. }

  6. //线程 1
  7. class Thread1 implements Runnable {
  8.         private Resource r;

  9.         public Thread1(Resource r) {  
  10.                 this.r = r;
  11.         }

  12.         public void run() {  
  13.                         synchronized (r) {   
  14.                                 while(r.i<100){
  15.                                         System.out.println("A="+r.i);
  16.                                         r.i++;
  17.                                         r.notify();//唤醒
  18.                                         try{
  19.                                                 r.wait();//等待
  20.                                         }catch (InterruptedException e) {     
  21.                                                 e.printStackTrace();
  22.                                         }
  23.                                 }
  24.                         }
  25.         }
  26. }

  27. //线程2
  28. class Thread2 implements Runnable {
  29.         private  Resource r;
  30.         public Thread2(Resource r) {
  31.                 this.r = r;
  32.         }
  33.         public void run() {
  34.                 synchronized (r) {
  35.                         while(r.i <100){  
  36.                                 System.out.println("B="+r.i);
  37.                                 r.i++;
  38.                                 r.notify();//唤醒
  39.                                 try {
  40.                                         r.wait();//等待
  41.                                 }catch (InterruptedException e) {     
  42.                                         e.printStackTrace();
  43.                                 }
  44.                         }
  45.                 }
  46.         }
  47. }

  48. //主线程
  49. public class ThreadDemo6{
  50.         public static void main(String[] args){
  51.                 Resource r =new Resource();
  52.                 Thread t1=new Thread(new Thread1(r));
  53.                 Thread t2=new Thread(new Thread2(r));
  54.                 t1.start();
  55.                 t2.start();
  56.         }
  57. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2