我正在使用StyledText 400x100小部件,它就像一个程序与用户交互的控制台。
这是我更新小部件的方式:
private static Shell MainShell = null;
public void createPartControl(Composite parent){
MainShell = parent.getShell();
}
public static void updateConsole(final String newMessage){
if(MainShell.isDisposed() || myStyledText.isDisposed() ) return;
MainShell.getDisplay().syncExec(new Runnable(){
myStyledText.setText( newMessage + "\n" + myStyledText.getText() );
});
}
与append()类似,但是这一个插入到第一行并插入一个换行符" \ n"。
我使用CycleBarrier来处理线程。目前它运行了300多个线程,我只允许10个线程/周期来杀死CPU。
// divide 300/10 because there is an inner for() which runs 10 threads / cycle
for(int n = 0; n < 300/10; n++){
// allow only 10 threads to work
final CycleBarrier br = new CycleBarrier(10);
for(int i = 0; i < 10; i++){
new Thread(new MyClass(cb).start();
}
//waiting for Threads to reach the barrier
br.await();
}
现在 MyClass 类:
public MyClass implements Runnable{
private CycleBarrier cb;
public MyClass(CycleBarrier cb){
this.cb = cb;
}
@Override
public void run(){
for(int i = 0; i < 256; i++){
for(int j = 0; j < 256; j++){
//View is the main class (eclipse RCP) and updateing the widget
View.updateConsole("matrix["+i+"]["+j+"]");
// Just an integer which counts the number of the loops
View.TOTAL_LOOPS++;
}
}
cb.await();
}
}
这是一个例子。它应该以异步方式(不按顺序)写入View小部件,因为Threads没有按顺序到达屏障。
我正在使用eclipse RCP(3.8)。
问题
为什么程序在DEBUG模式下工作正常?我设置了一个断点,我开始新的线程(在内部for()),然后点击Resume按钮逐个启动线程。 当我试图在正常模式下打开(RUN或导出)时,会出现&#34;泄漏&#34; (我不知道如何命名),控制台中的线路较少。 View.TOTAL_LOOPS 应该总计:
256 * 256 * 10 * 30 = 19660800 // View.TOTAL_LOOPS ++;在MyClass中
并且在正常运行中它具有动态结果:174614904,17025759等。在调试模式下,它达到了确切的值。
问题:
线程被杀了吗?
答案 0 :(得分:2)
与SWT无关。您正在一次增加10个线程中的单个共享变量。这是竞争条件的典型例子。由于++
不是原子操作,所以会发生类似这样的事情:
int temp = View.TOTAL_LOOPS; // in thread 1
int temp = View.TOTAL_LOOPS; // in thread 2
int temp2 = temp + 1; // in thread 1
View.TOTAL_LOOPS = temp2; // in thread 1
int temp2 = temp + 1; // in thread 2
View.TOTAL_LOOPS = temp2; // in thread 2
注意View.TOTAL_LOOPS
此后仅增加1,显然如果你逐个启动线程就不会发生。
如果您只是想要一个线程安全的计数器或者正确地同步您的线程,请使用AtomicInteger
。