所以我寫了這個程序來運行這個機器人類的多個線程使用cyclicbarrier來同步線程。由於我對循環屏障的理解很少,我認爲它會自動同步我的線程,但似乎沒有。基於我的進度整數值,我的機器人線程需要做什麼才能同步?線程對象不同步
public class Robot implements Runnable{
public static final int on = 0x0001;
public static final int clockwise = 0x0002;
public static final int counter = 0x0004;
int opcode;
int moveCount = 0;
int rotation, increment, progress = 0;
boolean CW;
ProgressBar prgBar;
CyclicBarrier cyclicBarrier;
Controller c;
Motor m;
public Robot(CyclicBarrier cyclicBarrier, Motor m)
{
opcode = 0;
this.cyclicBarrier = cyclicBarrier;
this.m = m;
}
public void run(){
System.out.println("Running: ");
try {
while(progress <= 24){
i = m.Engage(this, i, increment/4);
prgBar.setProgress(this, progress);
}
System.out.println("Sleeping: ");
Thread.sleep(3000);
System.out.println(Thread.currentThread().getName()+ " waiting at barrier 1");
cyclicBarrier.await();
while(progress <= 49){
i = m.Engage(this, i, increment/2);
prgBar.setProgress(this, progress);
}
System.out.println("Sleeping: ");
Thread.sleep(3000);
System.out.println(Thread.currentThread().getName()+ " waiting at barrier 2");
cyclicBarrier.await();
while(progress <= 74){
i = m.Engage(this, i, ((increment/4)*3));
prgBar.setProgress(this, progress);
}
System.out.println("Sleeping: ");
Thread.sleep(3000);
System.out.println(Thread.currentThread().getName()+ " waiting at barrier 3");
cyclicBarrier.await();
while(progress <= 99){
i = m.Engage(this, i, increment);
prgBar.setProgress(this, progress);
}
System.out.println("Sleeping: ");
Thread.sleep(3000);
System.out.println(Thread.currentThread().getName()+ " waiting at barrier 4");
cyclicBarrier.await();
} catch (Exception e){
e.printStackTrace();
}
prgBar.setProgress(this, progress);
System.out.println("Engaging: ");
}
公共類控制器{
public static void main(String[] args){
CyclicBarrier cyclicBarrier = new CyclicBarrier(4);
Motor m = new Motor();
Robot xRob = new Robot(cyclicBarrier, m);
Robot yRob = new Robot(cyclicBarrier, m);
Robot zRob = new Robot(cyclicBarrier, m);
Thread xRobThread = new Thread(xRob);
Thread yRobThread = new Thread(yRob);
Thread zRobThread = new Thread(zRob);
boolean clockwise = true, counterClockwise = false;
m.setMotor(clockwise, 14400, xRob);
m.setMotor(clockwise, 7200, yRob);
m.setMotor(counterClockwise, 28800, zRob);
xRobThread.start();
yRobThread.start();
zRobThread.start();
try {
xRobThread.join();
yRobThread.join();
zRobThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.printf("x = %d y = %d z = %d\n\n", xRob.moveCount, yRob.moveCount, zRob.moveCount);
}
}
因爲我對循環屏障的理解很少,我認爲它會自動同步我的線程,但它似乎不是._你認真嗎?請閱讀javadoc。 – 2014-11-24 07:30:16
我用過去式,現在明白了,情況並非如此。我也多次閱讀過它,對我來說沒有任何意義,因爲我的代碼與他們的例子並不完全相同。他們也沒有真正解釋如何在基於障礙點的變量之間分配工作。 – 2014-11-24 07:48:01
問題是,你認爲「同步我的線程」應該是什麼意思?也就是說,你期望這個班級做什麼?它做什麼呢?爲什麼這會讓你感到驚訝?如果您向我們展示完整的程序,它可能會有很大的幫助。你只向我們展示了一個使用CyclicBarrier的類。您沒有向我們展示CyclicBarrier的創建,也沒有向我們展示創建任何運行您的Robot類的線程。 – 2014-11-24 08:05:47