线程交替问题
想定义两个线程交替运行,以sum为指标,sum=0 运行线程0,在线程0里把,sum设为1;sum=1时运行线程1,在线程1里,把sum置为0,依次循环,并计算线程交替时间。
结果应该是
0
1
0
1
0
1
0
1
。。。。
高手看看我的程序哪里出错:
class Number0 extends Thread{
//public long lasting;
public void run()
{
if (SumStore.sum == 0)
{
SumStore.sum = 1;
System.out.println("thread0 and sum is " + SumStore.sum);
}
//lasting = System.currentTimeMillis();
//long cost =
//System.out.println("threadswitch time " + cost);
//return;
//}
}
}
class Number1 extends Thread{
public long starting,lasting;
public void run()
{
if (SumStore.sum == 1)
{
SumStore.sum = 0;
System.out.println("thread1 and sum is " + SumStore.sum);
}
//starting = System.currentTimeMillis();
//long cost = starting - lasting;
//System.out.println("threadswitch time " + cost);
}
}
class SumStore {
public static int sum = 0;
}
/////////////////////////////////////////////////////////////////////////
public class threadswitching
{
/**
* @param args
*/
public static void main(String[] args) throws Exception
{
for(int i=1; i<3; i++){
Thread t1 = new Number0();
Thread t2 = new Number1();
t1.start();
t2.start();
}
}
}
[解决办法]
class Number0 extends Thread {
// public long lasting;
public void run() {
while (true) {
synchronized (SumStore.class) {
try {
if (SumStore.sum == 0) {
SumStore.sum = 1;
System.out.println("thread0 and sum is "
+ SumStore.sum);
}
SumStore.class.notifyAll();
Thread.sleep(300);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// lasting = System.currentTimeMillis();
// long cost =
// System.out.println("threadswitch time " + cost);
// return;
// }
}
}
class Number1 extends Thread {
public long starting, lasting;
public void run() {
while (true) {
synchronized (SumStore.class) {
try {
SumStore.class.wait();
if (SumStore.sum == 1) {
SumStore.sum = 0;
System.out.println("thread1 and sum is "
+ SumStore.sum);
}
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// starting = System.currentTimeMillis();
// long cost = starting - lasting;
// System.out.println("threadswitch time " + cost);
}
}
class SumStore {
public static int sum = 0;
}
// ///////////////////////////////////////////////////////////////////////
public class threadswitching {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
Thread t1 = new Number0();
Thread t2 = new Number1();
t1.start();
t2.start();
}
}