package 多线程;
class Producer implements Runnable{
private Data data;
public Producer(Data data){
this.data=data;
}
@Override
public synchronized void run() {
for(int i=0;i<50;i++){
if(i%2==0){
this.data.setTitle("饼干");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.data.setValue("麦香饼干");
}else{
this.data.setTitle("饮料");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.data.setValue("果汁好喝");
}
}
}
}
class Consumer implements Runnable{
private Data data;
public Consumer(Data data){
this.data=data;
}
@Override
public synchronized void run() {
for(int i=0;i<50;i++){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("消费:"+this.data.getTitle()+"->"+this.data.getValue());
}
}
}
class Data{
private String title;
private String value;
public void setTitle(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
public void setValue(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
public class TestProducerConsumer {
public static void main(String[] args) {
Data data=new Data();
new Thread(new Producer(data)).start();
new Thread(new Consumer(data)).start();
}
}
数据错乱
package 多线程;
class Producer implements Runnable{
private Data data;
public Producer(Data data){
this.data=data;
}
@Override
public void run() {
for(int i=0;i<50;i++){
if(i%2==0){
this.data.set("饼干","麦香饼干");
}else{
this.data.set("饮料","果汁好喝");
}
}
}
}
class Consumer implements Runnable{
private Data data;
public Consumer(Data data){
this.data=data;
}
@Override
public void run() {
for(int i=0;i<50;i++){
System.out.println("消费:"+this.data.get());
}
}
}
class Data{
private String title;
private String value;
public synchronized void set(String title,String value) {
//若不加synchronized仍会有数据错乱现象
this.title = title;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.value=value;
}
public synchronized String get() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
return title+"->"+value;
}
}
public class TestProducerConsumer {
public static void main(String[] args) {
Data data=new Data();
new Thread(new Producer(data)).start();
new Thread(new Consumer(data)).start();
}
}
解决错乱,但有重复现象(非奇偶交替)
package 多线程;
class Producer implements Runnable{
private Data data;
public Producer(Data data){
this.data=data;
}
@Override
public void run() {
for(int i=0;i<50;i++){
if(i%2==0){
this.data.set("饼干","麦香饼干");
}else{
this.data.set("饮料","果汁好喝");
}
}
}
}
class Consumer implements Runnable{
private Data data;
public Consumer(Data data){
this.data=data;
}
@Override
public void run() {
for(int i=0;i<50;i++){
System.out.println("消费:"+this.data.get());
}
}
}
class Data{
private boolean flag=true;//如果不初始设置为true可能会在第一个消费时取得null
private String title;
private String value;
public synchronized void set(String title,String value) {
if(this.flag==false)
try {
super.wait();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
//若不加synchronized仍会有数据错乱现象
this.title = title;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.value=value;
this.flag=false;
super.notify();
}
public synchronized String get() {
if(this.flag==true)
try {
super.wait();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.flag=true;
super.notify();
return title+"->"+value;
}
}
public class TestProducerConsumer {
public static void main(String[] args) {
Data data=new Data();
new Thread(new Producer(data)).start();
new Thread(new Consumer(data)).start();
}
}
解决重复问题