public class Sum implements Runnable{
static int sum=5;
boolean flag=true;
public Sum(boolean flag) {
super();
this.flag=flag;
}
public synchronized void run() {
while (-30<sum&&sum<30) {
if(flag) {
add();
}else {
sub();
}
}
}
public synchronized void add() {
sum=sum+4;
System.out.println(Thread.currentThread().getName()+"加后:"+sum);
}
public synchronized void sub() {
sum=sum-5;
System.out.println(Thread.currentThread().getName()+"减后:"+sum);
}
}
主方法
Sum[] array=new Sum[4];
for(int i=0;i<array.length;i++) {
Sum sum=new Sum(i%2==0?true:false);
Thread t=new Thread(sum,"线程"+i);
t.start();
}运行结果
线程0加后:9
线程0加后:7
线程3减后:3
线程2加后:8
线程2加后:10
线程2加后:14
线程1减后:4
线程1减后:13
线程1减后:8
线程1减后:3
线程1减后:-2
线程1减后:-7
线程1减后:-12
线程1减后:-17
线程1减后:-22
线程1减后:-27
线程1减后:-32
线程2加后:18
线程3减后:6
线程0加后:11
static int sum=5;
boolean flag=true;
public Sum(boolean flag) {
super();
this.flag=flag;
}
public synchronized void run() {
while (-30<sum&&sum<30) {
if(flag) {
add();
}else {
sub();
}
}
}
public synchronized void add() {
sum=sum+4;
System.out.println(Thread.currentThread().getName()+"加后:"+sum);
}
public synchronized void sub() {
sum=sum-5;
System.out.println(Thread.currentThread().getName()+"减后:"+sum);
}
}
主方法
Sum[] array=new Sum[4];
for(int i=0;i<array.length;i++) {
Sum sum=new Sum(i%2==0?true:false);
Thread t=new Thread(sum,"线程"+i);
t.start();
}运行结果
线程0加后:9
线程0加后:7
线程3减后:3
线程2加后:8
线程2加后:10
线程2加后:14
线程1减后:4
线程1减后:13
线程1减后:8
线程1减后:3
线程1减后:-2
线程1减后:-7
线程1减后:-12
线程1减后:-17
线程1减后:-22
线程1减后:-27
线程1减后:-32
线程2加后:18
线程3减后:6
线程0加后:11
public synchronized void add()
这种写法下同步约束只能对实例级别有效。
而你的sum是类级别的属性。所以估计你期望的效果应该不成立。
public class SyncStack {
private Vector<Character> buffer =
new Vector<Character>(100, 20);//初始100,增量20 public synchronized char pop() {
char c;
while (buffer.size() == 0) {//没有数据,等待
System.out.println("WAITing......");
try {this.wait(); } catch (InterruptedException e) { }
}
//获取数据
c = (buffer.remove(buffer.size()-1)).charValue();
System.out.println(" >>" +Thread.currentThread().getName() + ": " + c);
return c;
} public synchronized void push(char c) {
this.notify(); //是否位置必须放在方法的最后?
Character charObj = new Character(c);
buffer.addElement(charObj);
System.out.println( Thread.currentThread().getName() + ": " + c);
}
}
我发了三个比较直观的线程列子在博客,你可以copy过来看看,对你或许有帮助。 死锁-----单列与同步-------消费者模式(多对多) 分别由浅至深。http://bbs.csdn.net/topics/392287406