package cn.everest.thread;
public class OperateThreadShareDate2 {
public static void main(String[] args) {
Resource resource = new Resource();
IncreData increData = new IncreData(resource);
DecreData decreData = new DecreData(resource);
for (int i = 0; i < 2; i++) {
new Thread(increData).start();
new Thread(decreData).start();
}
}
}
class IncreData implements Runnable {
private Resource resource;
public IncreData(Resource resource) {
this.resource = resource;
}
@Override
public void run() {
for (int i = 0; i < 50; i++) {
resource.increment();
}
}
}
class DecreData implements Runnable {
private Resource resource;
public DecreData(Resource resource) {
this.resource = resource;
}
@Override
public void run() {
for (int i = 0; i < 50; i++) {
resource.decrement();
}
}
}
class Resource {
private int x = 0;
private boolean flag = false;
public Resource() {
}
public void increment() {
synchronized (this) {
try {
while (flag) {
this.wait();
}
x = x + 1;
System.out.println("x +++++++++++++++++++++++: " + x);
flag = !flag;
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
this.notifyAll();
}
}
}
public void decrement() {
synchronized (this) {
try {
while (!flag) {
this.wait();
}
x = x - 1;
System.out.println("x ------------: " + x);
flag = !flag;
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
this.notifyAll();
}
}
}
}
内部类实现:
package cn.everest.thread;
public class OperateThreadShareData {
ShareData shareData = new ShareData();
public static void main(String[] args) {
OperateThreadShareData threadShareData = new OperateThreadShareData();
MyRunnable1 myRunnable1 = threadShareData.new MyRunnable1();
MyRunnable2 myRunnable2 = threadShareData.new MyRunnable2();
for (int i = 0; i < 2; i++) {
new Thread(myRunnable1).start();
new Thread(myRunnable2).start();
}
}
class MyRunnable1 implements Runnable {
public void run() {
for (int i = 0; i < 50; i++) {
shareData.increment();
}
}
}
class MyRunnable2 implements Runnable {
public void run() {
for (int i = 0; i < 50; i++) {
shareData.decrement();
}
}
}
}
class ShareData{
private int data = 0;
public ShareData() {}
public synchronized void increment(){
try {
while(data > 0) {
this.wait();
}
data = data + 1;
System.out.println("data +++++++++++ " + data);
} catch (Exception e) {
e.printStackTrace();
} finally {
this.notifyAll();
}
}
public synchronized void decrement() {
try {
while(data <= 0) {
this.wait();
}
data = data - 1;
System.out.println("data ------ " + data);
} catch (Exception e) {
e.printStackTrace();
} finally {
this.notifyAll();
}
}
}