设计一个生产与消费的程序
要求,生产一台,就消费一台,如果没有新的,就等待生产出来,在消费,如果生产出来的没有被消费,则等待消费之后再生产。
解决思路:使用多线程
原理:1.处理这个问题,需要使用多线程,使用多线程就会涉及到方法同步的问题,多线程同步又会涉及到死锁的问题,所以在处理多线程问题时,要很细心。
2.使用线程同步方法,加入Object类对线程的支持-------等待、唤醒
3.实现Runnable接口,可以资源共享
package thread.productCustom;
public class Info {
private String name;
private String content;
private boolean flag=false;
public synchronized void set(String name,String content){
if (flag) {
try {
super.wait(); //调用Object类对线程的支持
} catch (Exception e) {
// TODO: handle exception
}
}
setName(name);
setContent(content);
System.out.println("完成入参");
flag = true;
super.notify();
}
public synchronized void get(){
if (!flag) {
try {
super.wait();
} catch (Exception e) {
// TODO: handle exception
}
}
System.out.println("完成出参:"+getName()+"--->"+getContent());
flag=false;
super.notify();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
package thread.productCustom;
public class Product implements Runnable {
private Info info = null;
public Product(Info info){
this.info = info;
}
@Override
public void run() {
boolean flag = false;
for(int i = 0; i<10;i++){
if (flag) {
this.info.set("clj", "Java开发工程师!"+i);
flag = false;
}else {
this.info.set("W3C", "学的不仅仅是梦想!"+i);
flag = true;
}
}
}
}
package thread.productCustom;
public class Customer implements Runnable{
private Info info = null;
public Customer(Info info){
this.info = info;
}
@Override
public void run() {
for(int i=0;i<10;i++){
try {
Thread.sleep(100);
} catch (Exception e) {
}
this.info.get();
}
}
}
结果:
完成入参
完成出参:W3C--->学的不仅仅是梦想!0
完成入参
完成出参:clj--->Java开发工程师!1
完成入参
完成出参:W3C--->学的不仅仅是梦想!2
完成入参
完成出参:clj--->Java开发工程师!3
完成入参
完成出参:W3C--->学的不仅仅是梦想!4
完成入参
完成出参:clj--->Java开发工程师!5
完成入参
完成出参:W3C--->学的不仅仅是梦想!6
完成入参
完成出参:clj--->Java开发工程师!7
完成入参
完成出参:W3C--->学的不仅仅是梦想!8
完成入参
完成出参:clj--->Java开发工程师!9
模拟竞拍、抢答器
解决思路:使用多线程
原理: 1.实现Runnable接口,资源共享
2.使用关键字synchronized实现同步
package thread.answer;
public class MyThread implements Runnable{
private boolean flag = true;
@Override
public void run() {
this.answer();
}
public synchronized void answer(){
while (flag) {
System.out.println(Thread.currentThread().getName()+"success!");
flag = false;
return;
}
System.out.println(Thread.currentThread().getName()+"failed");
return;
}
public static void main(String[] args) {
MyThread my = new MyThread();
new Thread(my,"线程1").start();
new Thread(my,"线程2").start();
new Thread(my,"线程3").start();
new Thread(my,"线程4").start();
}
}
线程1success!
线程3failed
线程4failed
线程2failed