我的一个多线程案例,到目前只学到这,如果后期有其他更好的,我会修改的!
package test;
public class test2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Resource1 res = new Resource1();//创建一个生产和出售
Production pro = new Production(res);
Consumer1 con = new Consumer1(res);
Thread t1 = new Thread(pro);
Thread t2 = new Thread(con);
t1.start();
t2.start();
}
}
class Resource1 {
private String name;//存储商品的名字
private int count = 0;//存储生产数量
private Boolean flag = false;//标志位,当生产完成后读取标志位来执行出售
public synchronized void set(String name) {
while (flag) {//循环判断标志位当程序是单个生产、出售时也可以用if,多个时就要循环判断,避免生产时唤醒另一个生产线程,导致多个生产,单个销售。
try {
wait();//当flag变成ture时休眠生产线程。
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.name = name + ":" + count++;//为了方便直接在传值的时候就加上生产数量
System.out.println(Thread.currentThread().getName() + "生产" + this.name);//Thread.currentThread().getName()获取线程名
flag = true;//休眠生产线程
this.notify();//唤醒另一个线程,如果是多生产多销售就把这句改成 this.notifyAll();唤醒全部线程。
}
public synchronized void get() {
while (!flag) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "出售" + this.name);
flag = false;
this.notify();
}
}
class Production implements Runnable {
private Resource1 res;
public Production(Resource1 res) {
this.res = res;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
res.set("手机");
}
}
}
class Consumer1 implements Runnable {
private Resource1 res;
public Consumer1(Resource1 res) {
this.res = res;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
res.get();
}
}
}
附上思考的大致流程图