public void addElement( Patient newPatient )
{
synchronized ( lock )
{
Log query = incomingPatient.getLog();
results = query.getAllSearchResults();
for ( int k = 0; k < results.length; k++)
{
.... // add to table
setMaxColSize(MyTable);
tableContents.add(MyTable);
}
}
}
避免多線程錯誤
有一些方法可以避免可怕的線程錯誤:
如果依靠線程優先級來使線程保持同步,那么測試 JVM 的各種類就顯得非常重要。小心可能發生兩個線程同時賦值給 long 和 double 變量。其討厭的結果是一個線程的更改可能更改某個變量,而第二個線程可能再次改變同一個變量。請考慮對那些變量類型進行同步賦值。
永不使用 stop() 方法。實際上,Java 2 中反對該方法。它會立即停止進程,但又不進行整理,這會導致許多問題,包括死鎖和內存鎖定。 應始終通過從 run() 方法返回來終止線程。
不要重新啟動已停止的線程。run() 方法沒有被調用,而 isAlive() 方法報告錯誤,指出實際上線程已死。
不要獨占 CPU。如果程序的一部分獨占了 CPU,就應該運行 yield() 方法,此方法可以讓其它線程也有機會運行。請參閱這個小示例:
double answer = 0;
for (int i=0; i<10000; i++) {
for (int j = 0; i<10000; j++) {
answer = ((answer * i) + j) / j;
}
Thread.yield(); // Now other threads may run while this
//runs in the background
}