Java多线程3(三种方式混合实现)

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MyThread005
{
    public static void main(String[] args)
    {
        //创建线程池
        ExecutorService exe = Executors.newFixedThreadPool(5);
        //执行
        TA ta = new TA();//创建操作对象ta
        TR tb = new TR();//创建操作对象tb
        Thread ta1 = new Thread(ta);
        Thread ta2 = new Thread(ta);
        Thread ta3 = new Thread(ta);
        Thread tb1 = new Thread(tb);
        Thread tb2 = new Thread(tb);

        exe.execute(ta1);
        exe.execute(ta2);
        exe.execute(ta3);
        exe.execute(tb1);
        exe.execute(tb2);
        //停止
        exe.shutdown();
    }

}

class TA extends Thread
{
    private String lock = "lock";//对象锁
    private int apple = 30;

    public void run()
    {
        synchronized (lock)//一直独占这个对象锁,也就是获取了控制权
        {
            lock.notify();//继续执行
            while (apple > 0)
            {
                try
                {
                    System.out.println(Thread.currentThread().getName() + ":卖出了第" + (31 - apple) + "个apple");
                    --apple;
                    Thread.yield();//給同优先级的线程让步
                    lock.wait(100);//释放对象锁,让出lock对象,让别的线程执行
                } catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
        }

    }
}

class TR implements Runnable
{
    private int iphone = 30;
    private Object obj = "";

    public int sell()
    {

        //如果此处为while循环将只有一个线程执行,另一个线程无法执行
        if (iphone > 0)
        {
            System.out.println(Thread.currentThread().getName() + ":卖出了第" + (31 - iphone) + "个iphone");
            --iphone;
        }
        return 30 - iphone;
    }


    @Override
    public void run()
    {
        try
        {
            while (iphone > 0)
            {
                synchronized (obj)//获得控制权
                {
                    obj.notify();//继续执行
                    sell();
                    obj.wait(100);//释放控制权
                    Thread.sleep(100);//睡觉100ms.醒来接着买,但是不释放控制权
                }
            }
        } catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }
}

执行结果如下:
pool-1-thread-1:卖出了第1个apple
pool-1-thread-2:卖出了第2个apple
pool-1-thread-1:卖出了第3个apple
pool-1-thread-4:卖出了第1个iphone
pool-1-thread-3:卖出了第4个apple
pool-1-thread-2:卖出了第5个apple
pool-1-thread-5:卖出了第2个iphone
pool-1-thread-1:卖出了第6个apple
pool-1-thread-2:卖出了第7个apple
pool-1-thread-3:卖出了第8个apple
pool-1-thread-4:卖出了第3个iphone
pool-1-thread-5:卖出了第4个iphone
pool-1-thread-1:卖出了第9个apple
pool-1-thread-3:卖出了第10个apple
pool-1-thread-2:卖出了第11个apple
pool-1-thread-2:卖出了第12个apple
pool-1-thread-1:卖出了第13个apple
pool-1-thread-3:卖出了第14个apple
pool-1-thread-3:卖出了第15个apple
pool-1-thread-5:卖出了第5个iphone
pool-1-thread-2:卖出了第16个apple
pool-1-thread-4:卖出了第6个iphone
pool-1-thread-1:卖出了第17个apple
pool-1-thread-1:卖出了第18个apple
pool-1-thread-5:卖出了第7个iphone
pool-1-thread-3:卖出了第19个apple
pool-1-thread-2:卖出了第20个apple
pool-1-thread-2:卖出了第21个apple
pool-1-thread-4:卖出了第8个iphone
pool-1-thread-1:卖出了第22个apple
pool-1-thread-3:卖出了第23个apple
pool-1-thread-3:卖出了第24个apple
pool-1-thread-5:卖出了第9个iphone
pool-1-thread-2:卖出了第25个apple
pool-1-thread-1:卖出了第26个apple
pool-1-thread-1:卖出了第27个apple
pool-1-thread-4:卖出了第10个iphone
pool-1-thread-3:卖出了第28个apple
pool-1-thread-2:卖出了第29个apple
pool-1-thread-2:卖出了第30个apple
pool-1-thread-5:卖出了第11个iphone
pool-1-thread-4:卖出了第12个iphone
pool-1-thread-5:卖出了第13个iphone
pool-1-thread-4:卖出了第14个iphone
pool-1-thread-5:卖出了第15个iphone
pool-1-thread-4:卖出了第16个iphone
pool-1-thread-5:卖出了第17个iphone
pool-1-thread-4:卖出了第18个iphone
pool-1-thread-5:卖出了第19个iphone
pool-1-thread-5:卖出了第20个iphone
pool-1-thread-4:卖出了第21个iphone
pool-1-thread-4:卖出了第22个iphone
pool-1-thread-5:卖出了第23个iphone
pool-1-thread-4:卖出了第24个iphone
pool-1-thread-5:卖出了第25个iphone
pool-1-thread-4:卖出了第26个iphone
pool-1-thread-4:卖出了第27个iphone
pool-1-thread-5:卖出了第28个iphone
pool-1-thread-5:卖出了第29个iphone
pool-1-thread-4:卖出了第30个iphone

Process finished with exit code 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值