我试图设置2个线程,增加或减少另一个类中的整数。我在同步这个属性方面遇到了一些问题。
这是我设置线程和计数器类的主要类:
public class Main {
public static void main(String[] arg) {
Counter c = new Counter(10000000);
Thread1 t1 = new Thread1(c);
Runnable2 r2 = new Runnable2(c);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
System.out.println(t.getNumber());
}
}
这是我的柜台班:
public class Counter{
private int number;
private static final Object countLock = new Object();
public Counter(int number){
this.number= number;
}
public void increase(){
synchronized(countLock){
number++;
}
}
public void decrease(){
synchronized(countLock){
number--;
}
}
public int getNumber(){
return number;
}
}
这是我的Thread1类:( runnable类是相同的,只是使用'实现Runnable'而不是'扩展Thread')
public class Thread1 extends Thread{
private Counter c;
public Thread1(Counter c){
this.c = c;
}
public void run(){
for(int i = 0; i < c.getNumber(); i++){
c.increase();
}
}
}
但是,我的输出总是10000000.即使我同步了两种方法。 是否有人可以解释发生了什么?
答案 0 :(得分:0)
当我运行你的代码时,System.out.println(t.getNumber());
正在执行任何一个线程之前被执行。
答案 1 :(得分:0)
首先,这实际上永远不会完成,因为您在同一循环中增加了在for
循环中用作上限的值。不确定这是否是所需的行为。
其次,您的System.out.println
将(很可能)始终打印Counter
中使用的初始值,因为线程没有时间完成工作。出于测试目的,您可以添加TimeUnit.SECONDS.sleep(10);
之类的内容。但是对于更复杂的方法,我建议你看一下java.util.concurrent.Executors
和java.util.concurrent.ExecutorService
(那里有很多例子)。
第三,如果用Counter
替换int number
java.util.concurrent.atomic.AtomicInteger
,您的生活将会轻松很多。
答案 2 :(得分:0)
启动后添加t1.join(); t2.join();
,以便线程在main
线程执行sysout之前完成任务。
另一方面,我认为线索永远不会出现for loop
,因为c.getNumber()
不断增加。
我想你想要
int number=c.getNumber();
for(int i = 0; i < number; i++) {
而不是
for(int i = 0; i < c.getNumber(); i++) {