Gleichzeitiges Lesen von Cell-Werten in mehreren Threads

Contents
[ ]

Um Zellenwerte in mehr als einem Thread gleichzeitig zu lesen, setWorksheet.getCells().setMultiThreadReading() zuwahrWenn Sie dies nicht tun, erhalten Sie möglicherweise die falschen Zellenwerte. Bitte beachten Sie, dass einige Funktionen wie das Formatieren von Zellenwerten für mehrere Threads nicht unterstützt werden. MultiThreadReading ermöglicht Ihnen also nur den Zugriff auf die Originaldaten der Zelle. Wenn Sie in einer Umgebung mit mehreren Threads versuchen, den formatierten Wert der Zelle abzurufen, z. B. durch Cell.getStringValue() für numerische Werte, erhalten Sie möglicherweise ein unerwartetes Ergebnis oder eine Ausnahme.

Der folgende Code:

  1. Erstellt eine Arbeitsmappe.
  2. Fügt ein Arbeitsblatt hinzu.
  3. Füllt das Arbeitsblatt mit Zeichenfolgenwerten.
  4. Anschließend werden zwei Threads erstellt, die gleichzeitig Werte aus zufälligen Zellen lesen. Wenn die gelesenen Werte korrekt sind, passiert nichts. Wenn die gelesenen Werte falsch sind, wird eine Meldung angezeigt.

Wenn Sie diese Zeile kommentieren:

testWorkbook.getWorksheets().get(0).getCells().setMultiThreadReading(true);

dann kommt folgende meldung:

if (s.equals("R" + row + "C" + col)!=true)

{

    System.out.println("This message box will show up when cells read values are incorrect.");

}

Andernfalls läuft das Programm ohne Meldung, was bedeutet, dass alle aus Zellen gelesenen Werte korrekt sind.

// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-Java
public abstract class ThreadProc implements Runnable {
boolean isRunning = true;
Workbook testWorkbook;
Random r = new Random();
public ThreadProc(Workbook workbook) {
this.testWorkbook = workbook;
}
public int randomNext(int Low, int High) {
int R = r.nextInt(High - Low) + Low;
return R;
}
public void kill() {
this.isRunning = false;
}
public void run() {
while (this.isRunning) {
int row = randomNext(0, 10000);
int col = randomNext(0, 100);
//Commonly you can only access Cell.Value instead of Cell.StringValue.
//In this demo all cell values are string, so Cell.StringValue is same with Cell.Value here and can be used.
//For other values such as numeric, if you call Cell.StringValue here, you may get unexpected result or exception here.
//It is because that Cell.getStringValue() will format those values according to the number format but the formatting process
//does not support multi-threads.
String s = testWorkbook.getWorksheets().get(0).getCells().get(row, col).getStringValue();
if (s.equals("R" + row + "C" + col) != true) {
System.out.println("This message box will show up when cells read values are incorrect.");
}
}
}
}
// Main.Java
static void TestMultiThreadingRead() throws Exception {
Workbook testWorkbook = new Workbook();
testWorkbook.getWorksheets().clear();
testWorkbook.getWorksheets().add("Sheet1");
for (int row = 0; row < 10000; row++)
for (int col = 0; col < 100; col++)
testWorkbook.getWorksheets().get(0).getCells().get(row, col).setValue("R" + row + "C" + col);
//Commenting this line will show a pop-up message
testWorkbook.getWorksheets().get(0).getCells().setMultiThreadReading(true);
ThreadProc tp = new ThreadProc(testWorkbook);
Thread myThread1 = new Thread(tp);
myThread1.start();
Thread myThread2 = new Thread(tp);
myThread2.start();
Thread.currentThread().sleep(5*1000);
tp.kill();
}