浅谈java多线程的生产/消费者模式-举例实战

       从事java工作已有三年了,对java的多线程有一些用到的很实用的心得,抽个空写出来,与大家分享一下。如有不当之处,希望能够指正。

        今天我们来从一个简单的例子:写两个线程,一个线程打印1~27,另一个线程打印A~Z,打印顺序是12A34B...5152Z,来看看java多线程最经典的模式之一:生产/消费者模式。

话不多说,我们来看下面的代码。

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


public class ThreadTestOne {

        //用Executors创建一个先进先出的线程池,线程池在下一篇的文章中会继续介绍。希望大家关注

public static  ExecutorService executorService=Executors.newFixedThreadPool(1);

       //用原子变量类构造一个锁对象,java的13个原子变量类,下一篇的文章中会继续介绍。希望大家关注

public   static AtomicInteger atomicInteger=new AtomicInteger();

       //定义一个条件开关,用来控制线程的切换

        public   static boolean cancel=false;

        //定义一个计数器,用来计算数字和转换数字到ascii码

public  static  int count=0;

public static void main(String agrs[]){
Thread1 thread1=new Thread1();
Thread2 thread2=new Thread2();
int i=1;
while(i<27){
i++;
executorService.execute(thread1);
executorService.execute(thread2);
}
}

protected static class Thread1 implements Runnable {
@Override
public void run() {
synchronized (atomicInteger) {
while(cancel){
try {
atomicInteger.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count++;
System.out.println(count);
count++;
System.out.println(count);
cancel=true;
atomicInteger.notify();
}

}

}
protected static class Thread2 implements Runnable {
@Override
public void run() {
synchronized (atomicInteger) {
while(cancel==false){
try {
atomicInteger.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

                                //数字强转成char类型,就能打印字母

System.out.println((char)((count/2)+'A'-1));
cancel=false;
atomicInteger.notify();
}
}
}
}

直接copy这些代码到myeclipse,就能运行。注意,notify用来唤醒一个在同步队列中的线程来获取对象的monitor锁,wait方法用于释放线程持有的对象monitor锁,将这个线程放到同步队列中,这两个方法必须要在synchronized代码块或者synchronized方法中执行,本文是为了易懂,所以才这样的写法,其实还有几种写法。这里就不一 一介绍,有兴趣的同学可以,尝试用不同的写法来实现。有关于线程池,原子变量类,synchronized,和同步队列。在下一篇文章中介绍。谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值