多线程习题(2)

/**

  • 1、使用生产者和消费者模式实现,交替输出:
  • 假设只有两个线程,输出以下结果:
  •  t1-->1
    
  •  t2-->2
    
  •  t1-->3
    
  •  t2-->4
    
  •  t1-->5
    
  •  t2-->6
    
  •  ....
    
  •  要求:必须交替,并且t1线程负责输出奇数。t2线程负责输出偶数。
    
  •  两个线程共享一个数字,每个线程执行时都要对这个数字进行:++
    

*/

package Thread;
/**
 * 1、使用生产者和消费者模式实现,交替输出:
 * 	假设只有两个线程,输出以下结果:
 * 		t1-->1
 * 		t2-->2
 * 		t1-->3
 * 		t2-->4
 * 		t1-->5
 * 		t2-->6
 * 		....
 *
 * 		要求:必须交替,并且t1线程负责输出奇数。t2线程负责输出偶数。
 * 		两个线程共享一个数字,每个线程执行时都要对这个数字进行:++
 */
public class ThreadTest16 {
    public static void main(String[] args) {
        //创建一个数字对象,共享。
        Num num = new Num();

        //奇数线程
        Thread t1 = new Thread(new Producer(num));
        //偶数线程
        Thread t2 = new Thread(new Customer(num));

        t1.setName("奇数");
        t2.setName("偶数");

        t1.start();
        t2.start();
    }
}

class Num {
    int i = 1;
}

// 输出奇数
class Producer implements Runnable{
    private Num num;

    public Producer(Num num) {
        this.num = num;
    }

    @Override
    public void run() {
        //一直生产(使用死循环来模拟一直生产)
        while (true){
            synchronized (num) {
                if (num.i % 2 == 0) {
                    try {
                        num.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }


                //程序能执行到这里说明不是偶数,然后输出。

                System.out.println(Thread.currentThread().getName() + "--->" + num.i++);

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                num.notifyAll();
            }

        }
    }
}
// 输出偶数
class Customer implements Runnable{
    private Num num;

    public Customer(Num num) {
        this.num = num;
    }

    @Override
    public void run() {
        while (true){
            synchronized (num) {
                if (num.i % 2 == 1) {
                    try {
                        num.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(Thread.currentThread().getName() + "--->" + num.i++);

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                num.notifyAll();
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值