Одновременное чтение значений Cell в нескольких потоках
Чтобы одновременно читать значения ячеек более чем в одном потоке, установитеРабочий лист.getCells().setMultiThreadReading() кистинныйЕсли вы этого не сделаете, вы можете получить неправильные значения ячеек. Обратите внимание, что некоторые функции, такие как форматирование значений ячеек, не поддерживаются для нескольких потоков. Таким образом, MultiThreadReading позволяет вам получать доступ только к исходным данным ячейки. В среде с несколькими потоками, если вы попытаетесь получить отформатированное значение ячейки, например, с помощью Cell.getStringValue() для числовых значений, вы можете получить неожиданный результат или исключение.
Следующий код:
- Создает рабочую книгу.
- Добавляет рабочий лист.
- Заполняет рабочий лист строковыми значениями.
- Затем он создает два потока, которые одновременно считывают значения из случайных ячеек. Если считанные значения верны, ничего не происходит. Если считанные значения неверны, отображается сообщение.
Если вы прокомментируете эту строку:
testWorkbook.getWorksheets().get(0).getCells().setMultiThreadReading(true);
то появится следующее сообщение:
if (s.equals("R" + row + "C" + col)!=true)
{
System.out.println("This message box will show up when cells read values are incorrect.");
}
В противном случае программа запускается без отображения каких-либо сообщений, что означает, что все значения, считанные из ячеек, верны.
// 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(); | |
} |