我是自学Java,我想了解多线程。我创建了一个带有作业的MyThread
类,以执行循环,直到条件成立为止,然后打印关于它的信息。它包含静态字段left
,它在构造函数中递增并在作业完成时递减。类Flag
正在'告诉'线程什么时候开始。 不幸的是,当所有线程完成时left
不等于零。我做了一些方法它变得更好,但它仍然不完美。 我在做什么错?在java中同步多线程
import java.util.Random;
class Flag
{
private boolean ok = false;
synchronized boolean ok()
{
return ok;
}
synchronized void setOk(boolean ok)
{
this.ok = ok;
}
}
class MyThread extends Thread
{
static int left = 0;
synchronized void add()
{
left++;
}
synchronized int remove()
{
return --left;
}
String name;
Flag flag;
Random rnd = new Random();
public MyThread(String name, Flag flag)
{
this.name = name;
this.flag = flag;
add();
}
public void run()
{
while(!flag.ok());
double rnd;
long count = 0;
do{
count++;
rnd = Math.random();
} while(rnd > 0.00001);
print(count);
}
synchronized void print(long count)
{
System.out.printf("%s %10d left: %3d%n", name, count, remove());
}
}
public class Test
{
public static void main(String... args) throws Exception
{
Flag flag = new Flag();
for(int i=0; i<2000; i++){
new MyThread(String.format("%04d",i),flag).start();
}
flag.setOk(true);
}
}
预期产量是多少? – Arpit 2013-03-17 08:08:50
在最后一行,我想看到lke'1540 243385 left:0'。它是(从左):线程名称,计数器(循环中有多少次迭代)和0(剩下的线程数)。相反,我得到了'1540 243385 left:5'之类的东西。 – 2013-03-17 08:11:24