Lesen von Zellwerten in mehreren Threads gleichzeitig.
Wie Sie mit Aspose.Cells for Java Zellenwerte in mehreren Threads gleichzeitig lesen können
Um Zellenwerte in mehr als einem Thread gleichzeitig zu lesen, setzen Sie Worksheet.getCells().setMultiThreadReading() auf wahr. Andernfalls erhalten Sie möglicherweise falsche Zellenwerte. Bitte beachten Sie, dass einige Funktionen wie das Formatieren von Zellenwerten für Mehrfachthreads nicht unterstützt werden. Das MultiThreadReading ermöglicht es Ihnen nur, auf die ursprünglichen Zellendaten zuzugreifen. In einer Mehrfachthreads-Umgebung erhalten Sie bei dem Versuch, den formatierten Wert der Zelle zu erhalten, wie z.B. mittels Cell.getStringValue() für numerische Werte, möglicherweise ein unerwartetes Ergebnis oder eine Ausnahme.
Der folgende Code:
- Erstellt ein Arbeitsblatt.
- Fügt ein Arbeitsblatt hinzu.
- Befüllt das Arbeitsblatt mit Zeichenfolgen.
- Es erstellt dann zwei Threads, die gleichzeitig Werte aus zufälligen Zellen lesen. Wenn die gelesenen Werte korrekt sind, passiert nichts. Wenn die gelesenen Werte inkorrekt sind, wird eine Meldung angezeigt.
Wenn Sie diese Zeile kommentieren:
testWorkbook.getWorksheets().get(0).getCells().setMultiThreadReading(true);
dann wird die folgende Nachricht angezeigt:
if (s.equals("R" + row + "C" + col)!=true)
{
System.out.println("This message box will show up when cells read values are incorrect.");
}
Ansonsten läuft das Programm ohne Anzeige einer Meldung, was bedeutet, dass alle Werte, die aus den Zellen gelesen wurden, 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(); | |
} |