线程出现重复取和重复赋值的情况
class Info{
private String name;
private String content;
public void setName(String name){
this.name = name ;
}
public void setContent(String content){
this.content = content ;
}
public String getName(){
return this.name ;
}
public String getContent(){
return this.content ;
}
public synchronized void set(String name, String content){
this.setName(name);
try{
Thread.sleep(300);
}catch(Exception e){
e.printStackTrace();
}
this.setContent(content);
}
public synchronized void get(){
try{
Thread.sleep(300);
}catch(Exception e){
e.printStackTrace();
}
System.out.println(this.getName() + "<--->" + this.getContent());
}
}
class Producer implements Runnable{
private Info info;
public Producer(Info info){
this.info = info;
}
@Override
public void run(){
boolean flag = false;
for (int i=0;i<50 ;i++ ){
if(flag){
this.info.set("123", "789");
flag = false;
}else{
this.info.set("abc", "xyz");
flag = true;
}
}
}
}
class Consumer implements Runnable{
private Info info;
public Consumer(Info info){
this.info = info;
}
@Override
public void run(){
for(int i=0;i<50 ;i++ ){
this.info.get();
}
}
}
public class T3 {
public static void main(String[] args) {
Info info = new Info();
Producer pro = new Producer(info);
Consumer con = new Consumer(info);
new Thread(pro).start();
new Thread(con).start();
}
}
利用Object类的wait()和notify()方法
class Info{
private String name = "123";
private String content = "789";
private boolean flag = false;
public void setName(String name){
this.name = name ;
}
public void setContent(String content){
this.content = content ;
}
public String getName(){
return this.name ;
}
public String getContent(){
return this.content ;
}
public synchronized void set(String name, String content){
if(!flag){
try{
super.wait();
}catch(Exception e){
e.printStackTrace();
}
}
this.setName(name);
try{
Thread.sleep(300);
}catch(Exception e){
e.printStackTrace();
}
this.setContent(content);
flag = !flag;
super.notify();
}
public synchronized void get(){
if(flag){
try{
super.wait();
}catch(Exception e){
e.printStackTrace();
}
}
try{
Thread.sleep(300);
}catch(Exception e){
e.printStackTrace();
}
System.out.println(this.getName() + "<--->" + this.getContent());
flag = !flag;
super.notify();
}
}
class Producer implements Runnable{
private Info info;
public Producer(Info info){
this.info = info;
}
@Override
public void run(){
boolean flag = false;
for (int i=0;i<50 ;i++ ){
if(flag){
this.info.set("123", "789");
flag = false;
}else{
this.info.set("abc", "xyz");
flag = true;
}
}
}
}
class Consumer implements Runnable{
private Info info;
public Consumer(Info info){
this.info = info;
}
@Override
public void run(){
for(int i=0;i<50 ;i++ ){
this.info.get();
}
}
}
public class T4 {
public static void main(String[] args) {
Info info = new Info();
Producer pro = new Producer(info);
Consumer con = new Consumer(info);
new Thread(pro).start();
new Thread(con).start();
}
}
分享到:
相关推荐
多线程生产者与消费者,,生产者和消费者的解答网络上有多种线程版本,但却没看到进程版本,所以我就来填补这一“空白”了。PS:使用进程版本的另一个重要原因是,想顺便复习下共享内存。 我们使用信号量来同步,用...
java线程生产者与消费者从基础到入门.docx
基本满足操作系统课上要求,java实现的生产者消费者模型。
本文通过多线程方法解决了生产者与消费者之间同步的问题
关于java多线程的东西,里面有生产者与消费者的案例,感兴趣的朋友看一下吧。
java多线程实现生产者和消费者
编写一个“生产者-消费者”的多线程演示程序,两个生产者,一个消费者,可以存放产品的仓库容量为10,仓库用栈实现,并有同步功能,且能防止先消费后生产的情况。
使用多线程实现了生产者和消费者模式
生产者消费者流程图; 生产者消费者流程图。
关于LINUX线程生产者和消费者例子,有很好的解释和帮助
a: 创建一个线程 ...h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more 生产者消费者问题 (1生产者 2消费者 4缓冲区) problem2 读者与写着问题 I: 信号量 semaphore 解决线程同步问题
c#多线程之生产者消费者
用线程实现生产者消费者问题,生产者消费者的个数任意!
用java多线程简易实现生产者消费者模式的代码,用java多线程简易实现生产者消费者模式的代码。
本代码是用JAVA实现的生产者与消费者的问题,线程间的同步与互斥功能
一组生产者线程与一组消费者线程通过缓冲区发生联系。生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。缓冲区有N 个,是一个环形的缓冲池。 使用命令cc consumer.c -o consumer编译
java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型...
此实例在windows 10系统上可以成功运行,可以修改一下,在linux上也可以运行,思路都是一样的。 说明:这个是个图书馆案例,默认100个座位,生产者与消费者各2个线程 (修改:加锁)
使用wait()和notify()实现的生产者与消费者模型,可以了解如何使用wait()和notify()进行线程间通信。(上一次上传的代码有一个问题没有考虑到,这次修补了——CSDN没法撤销资源,只能再上传了)
Qt5多线程,使用QSemaphore类实现生产者和消费者问题。