Lecture simultanée de valeurs Cell dans plusieurs threads
Pour lire les valeurs des cellules dans plusieurs threads simultanément, définissezFeuille de calcul.getCells().setMultiThreadReading() àvraiSi vous ne le faites pas, vous risquez d’obtenir les mauvaises valeurs de cellule. Veuillez noter que certaines fonctionnalités telles que le formatage des valeurs de cellule ne sont pas prises en charge pour les threads multiples. Ainsi, MultiThreadReading vous permet uniquement d’accéder aux données d’origine de la cellule uniquement. Dans un environnement à plusieurs threads, si vous essayez d’obtenir la valeur formatée de la cellule, par exemple par Cell.getStringValue() pour les valeurs numériques, vous pouvez obtenir un résultat inattendu ou une exception.
Le code suivant :
- Crée un classeur.
- Ajoute une feuille de calcul.
- Remplit la feuille de calcul avec des valeurs de chaîne.
- Il crée ensuite deux threads qui lisent simultanément des valeurs à partir de cellules aléatoires. Si les valeurs lues sont correctes, rien ne se passe. Si les valeurs lues sont incorrectes, alors un message s’affiche.
Si vous commentez cette ligne :
testWorkbook.getWorksheets().get(0).getCells().setMultiThreadReading(true);
alors le message suivant s’affiche :
if (s.equals("R" + row + "C" + col)!=true)
{
System.out.println("This message box will show up when cells read values are incorrect.");
}
Sinon, le programme s’exécute sans afficher de message, ce qui signifie que toutes les valeurs lues dans les cellules sont correctes.
// 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(); | |
} |