Java多线程例子
来源:互联网 发布:linux -l 怎么用 编辑:程序博客网 时间:2024/05/06 01:58
其中包括一个WoTou.java,代表消息
一个MsgQueue.java,为一个队列,提供put(Message msg)方法和get()方法
一个Produer.java,为生产者线程,在其run方法中每隔1秒产生一个Message对像并放入MsgQueue队列
一个Consumer.java为消费者线程,在其run方法中不断从MsgQueue队列中获取Message对像,并显示在屏幕上
一个TestMain.java,在其main方法中,启动2个Produer线程和2个消费者线程.
要求:
对于MsgQueue.java,队列的长度为10,当消息超过10个时,put()方法需要阻塞:当消息队列为空时,
get()方法需要阻塞。
public class ProducerConsumer {
public static void main(String[] args) {
SyncStack ss = new SyncStack();
Producer p1= new Producer(ss,"p1");
Consumer c1= new Consumer(ss,"c1");
Producer p2= new Producer(ss,"p2");
Consumer c2= new Consumer(ss,"c2");
}
}
class WoTou<T> {
int id;
WoTou(int id) {
this.id = id;
}
public String toString() {
return "WoTou : " + id;
}
}
class SyncStack {
int index = 0;
WoTou[] arrWT = new WoTou[6];
public void push(WoTou wt) {
while(index == arrWT.length) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notifyAll();
arrWT[index] = wt;
index ++;
}
public WoTou pop() {
while(index == 0) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notifyAll();
index--;
return arrWT[index];
}
}
class Producer implements Runnable {
SyncStack ss = null;
String a;
Producer(SyncStack ss,String a) {
this.ss = ss;
this.a= a;
Thread t=new Thread(this,a);
t.start();
}
public void run() {
for(int i=0; i<10; i++) {
synchronized(ss){
WoTou wt = new WoTou(i);
ss.push(wt);
System.out.println(a+" 生产了:" + wt);}
try {
Thread.sleep((int)(Math.random() * 200));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable {
SyncStack ss = null;
String a;
Thread t;
Consumer(SyncStack ss,String a) {
this.ss = ss;
this.a= a;
t=new Thread(this,a);
t.start();
}
public void run() {
for(int i=0; i<10; i++) {
synchronized(ss){
WoTou wt = ss.pop();
System.out.println(a+" 消费了: " + wt);}
try {
Thread.sleep((int)(Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
运行结果:
p1 生产了:WoTou : 0
p2 生产了:WoTou : 0
p3 生产了:WoTou : 0
c1 消费了: WoTou : 0
c1 消费了: WoTou : 0
p3 生产了:WoTou : 1
c1 消费了: WoTou : 1
c1 消费了: WoTou : 0
p3 生产了:WoTou : 2
p1 生产了:WoTou : 1
c1 消费了: WoTou : 1
p2 生产了:WoTou : 1
p2 生产了:WoTou : 2
c1 消费了: WoTou : 2
p2 生产了:WoTou : 3
p3 生产了:WoTou : 3
c1 消费了: WoTou : 3
p3 生产了:WoTou : 4
p2 生产了:WoTou : 4
c1 消费了: WoTou : 4
c1 消费了: WoTou : 4
p1 生产了:WoTou : 2
c1 消费了: WoTou : 2
p2 生产了:WoTou : 5
p3 生产了:WoTou : 5
p2 生产了:WoTou : 6
栈里有6个,就生产出来了6个
- java多线程小例子
- java多线程例子
- JAVA多线程经典例子
- java多线程例子
- java多线程例子
- java多线程例子
- java多线程例子
- java多线程例子
- Java 多线程 简单例子
- java多线程Socket例子
- java多线程例子
- java多线程例子
- java多线程例子
- java多线程例子
- java多线程例子
- java多线程源码例子
- java多线程例子
- Java多线程例子
- 添加sudo权限
- MinGW+Editplus 写C/C++程序设置
- uva_10361-Automatic Poetry
- 网站内嵌百度地图定向到公司位置
- 阅读HEVC源代码(二)--视频文件读取类TVideoIOYuv
- Java多线程例子
- hdu_1054_Strategic Game
- vSphere 5特性比较:单个大卷及多个小卷,你应该如何选择?
- ora-01033:oracle initialization or shutdown in progress 解决办法
- CSS控制文本自动换行
- happroxy的配置文件详解
- Tomcat使用总结文档(2012.11.08)
- 软键盘
- 信息时代,企业“一家独大”的好处