範例項目結構如下:
Document 類獲取測試數據
words.txt中文測試數據下載地址:
鏈接:https://pan.baidu.com/s/1Ydwo6IX_NYRsOEfw5PMQlQ
提取碼:4wjn
複製這段內容後打開百度網盤手機App,操作更方便哦
Document.java
package com.myth;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Document {
private String wordsChinese[] = {
"有", "些", "事", "把", "它", "埋", "藏", "在",
"心", "裏", "也", "許", "會", "更", "好", "時", "間",
"久", "了", "也", "就", "變", "成", "了", "故", "事",
"悲", "傷", "的", "秋", "千", "總", "有", "微",
"風", "陪", "伴", "孤", "寂", "的", "夜", "總", "有",
"繁", "星", "點", "點", "驀", "然", "回", "首",
"而", "你", "卻", "不", "在", "我", "的", "身", "邊",
"獨", "步", "在", "深", "秋", "的", "陽", "光", "下",
"看", "萬", "物", "如", "夢", "一", "般", "地", "逝",
"去", "聽", "流", "水", "在", "風", "中", "悲", "涼",
"我", "用", "那", "秋", "的", "氣", "息", "爲", "筆",
"爲", "夢", "爲", "紙", "描", "繪", "那", "曾", "經",
"有", "名", "字", "的", "回", "憶",
"我", "們", "在", "各", "自", "的", "小", "路", "上", "匆",
"匆", "地", "行", "走", "一", "直", "未", "曾", "停", "留",
"不", "經", "意", "間", "在", "某", "個", "路", "口", "遇",
"見", "於", "是", "輕", "輕", "地", "問", "候", "淡", "淡",
"地", "寒", "暄", "之", "後", "揮", "手", "說", "再", "見"
};
private String wordsEnglish[] = {
"Some", "things", "you", "hide", "it", "in", "your", "heart",
"perhaps", "better", "so", "a", "long", "time", "becomes", "the", "story",
"Sad", "swing", "total", "have", "breeze", "company", "lonely", "night",
"always", "have", "stars", "suddenly", "look", "back", "and", "you're", "not", "there",
"In", "late", "autumn", "sunlight", "see", "all", "things", "come", "to", "pass",
"and", "listen", "to", "dream", "like", "flowing", "water", "in", "the", "mind",
"with", "the", "breath", "of", "autumn", "sad", "for", "pen", "for", "your", "dreams",
"for", "paper", "Describe", "that", "named", "ever", "memories",
"We", "in", "their", "respective", "path", "in", "a", "hurry", "to", "work",
"has", "not", "stay", "at", "a", "crossroads", "casual", "greeting", "meeting",
"so", "gently", "light", "greet", "then", "waned", "and", "said", "goodbye",};
public List<String[]> generateDocument(int rowIndexEnd, int columnCount, int columnIndex, String findWord) {
int counter = 0;
List<String[]> document = new ArrayList<>();
Random random = new Random();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < rowIndexEnd; i++) {
String[] arrColums = new String[columnCount];
for (int j = 0; j < columnCount; j++) {
int index = random.nextInt(wordsChinese.length);
arrColums[j] = wordsChinese[index];
if (j > 0) {
sb.append("\t");
}
sb.append(wordsChinese[index]);
if (arrColums[columnIndex].equals(findWord)) {
counter++;
}
}
document.add(arrColums);
sb.append(System.lineSeparator());
}
System.out.println(sb.toString());
System.out.println("Document: The word " + findWord + " appears " + counter + " times in the document");
return document;
}
public List<String[]> getDocument(int columnCount, int columnIndex, String findWord) {
String inputFile = "D:\\human\\words.txt";
int counter = 0;
List<String[]> document = new ArrayList<>();
String line = null;
BufferedReader bufferedReader = null;
try {
bufferedReader = new BufferedReader(new FileReader(inputFile));
while ((line = bufferedReader.readLine()) != null) {
String[] arrStr = line.split("\t");
String[] arrColums = new String[columnCount];
for (int i = 0; i < columnCount; i++) {
arrColums[i] = arrStr[i];
}
if (arrStr[columnIndex].equals(findWord)) {
counter++;
}
document.add(arrColums);
}
bufferedReader.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Document: The word " + findWord + " appears " + counter + " times in the initial document");
return document;
}
}
LineTask.java 文本行任務類
package com.myth;
import java.util.concurrent.RecursiveTask;
public class LineTask extends RecursiveTask<Integer> {
private static final long serialVersionUID = 1L;
private String[] line;
private int columnIndex;
private String findWord;
public LineTask(String[] line, int columnIndex, String findWord) {
this.line = line;
this.columnIndex = columnIndex;
this.findWord = findWord;
}
@Override
protected Integer compute() {
Integer result = count(line, columnIndex, findWord);
return result;
}
private Integer count(String[] line, int indexColumn, String findWord) {
int counter = 0;
if (line[indexColumn].equals(findWord)) {
counter++;
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
return counter;
}
}
DocumentTask.java文檔任務類
package com.myth;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.RecursiveTask;
public class DocumentTask extends RecursiveTask<Integer> {
private List<String[]> document;
private int rowIndexStart, rowIndexEnd, columnIndex;
private String findWord;
public DocumentTask(List<String[]> document, int rowIndexStart, int rowIndexEnd, int columnIndex, String findWord) {
this.document = document;
this.rowIndexStart = rowIndexStart;
this.rowIndexEnd = rowIndexEnd;
this.columnIndex = columnIndex;
this.findWord = findWord;
System.out.println("rowIndexStart = " + rowIndexStart + " rowIndexEnd = " + rowIndexEnd);
}
protected Integer compute() {
int result = 0;
if (rowIndexEnd - rowIndexStart < 10) {
result = processLines(document, rowIndexStart, rowIndexEnd, columnIndex, findWord);
} else {
int mid = (rowIndexStart + rowIndexEnd) / 2;
DocumentTask docTask1 = new DocumentTask(document, rowIndexStart, mid, columnIndex, findWord);
DocumentTask docTask2 = new DocumentTask(document, mid, rowIndexEnd, columnIndex, findWord);
invokeAll(docTask1, docTask2);
try {
result = groupTaskSum(docTask1.get(), docTask2.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
return result;
}
private Integer processLines(List<String[]> document, int rowIndexStart, int rowIndexEnd, int columnIndex, String findWord) {
List<LineTask> tasks = new ArrayList<>();
for (int i = rowIndexStart; i < rowIndexEnd; i++) {
LineTask task = new LineTask(document.get(i), columnIndex, findWord);
tasks.add(task);
}
invokeAll(tasks);
int result = 0;
for (int i = 0; i < tasks.size(); i++) {
LineTask task = tasks.get(i);
try {
result = result + task.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
return new Integer(result);
}
private Integer groupTaskSum(Integer num1, Integer num2) {
Integer result;
result = num1 + num2;
return result;
}
}
MultiTask.java 多任務啓動入口
package com.myth;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.TimeUnit;
public class MultiTask {
public static void main(String[] args) {
String findWord1 = "sunlight";
String findWord2 = "秋";
int columnCount = 4;
int columnIndex = 1;
int rowIndexStart = 0;
int rowIndexEnd = 1000;
Document doc = new Document();
//List<String[]> document = doc.generateDocument(rowIndexEnd, columnCount, columnIndex,findWord1);
//DocumentTask docTask = new DocumentTask(document, rowIndexStart, rowIndexEnd, columnIndex, findWord1);
List<String[]> document = doc.getDocument(columnCount, columnIndex, findWord2);
DocumentTask docTask = new DocumentTask(document, rowIndexStart, rowIndexEnd, columnIndex, findWord2);
ForkJoinPool pool = new ForkJoinPool();
pool.execute(docTask);
do {
System.out.printf("******************************************\n");
System.out.printf("MultiTask: Parallelism: %d\n", pool.getParallelism());
System.out.printf("MultiTask: Active Threads: %d\n", pool.getActiveThreadCount());
System.out.printf("MultiTask: Task Count: %d\n", pool.getQueuedTaskCount());
System.out.printf("MultiTask: Steal Count: %d\n", pool.getStealCount());
System.out.printf("******************************************\n");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (!docTask.isDone());
pool.shutdown();
try {
pool.awaitTermination(1, TimeUnit.DAYS);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
//System.out.printf("MultiTask: The word %s appears %d times in the document.\n", findWord1, docTask.get());
System.out.printf("MultiTask: The word %s appears %d times in the document.\n", findWord2, docTask.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
註釋掉 DocumentTask.java文件代碼中第20行控制檯輸出內容,會打印如下信息:
run:
Document: The word 秋 appears 20 times in the initial document
******************************************
MultiTask: Parallelism: 4
MultiTask: Active Threads: 4
MultiTask: Task Count: 32
MultiTask: Steal Count: 0
******************************************
******************************************
MultiTask: Parallelism: 4
MultiTask: Active Threads: 4
MultiTask: Task Count: 18
MultiTask: Steal Count: 0
******************************************
******************************************
MultiTask: Parallelism: 4
MultiTask: Active Threads: 4
MultiTask: Task Count: 27
MultiTask: Steal Count: 0
******************************************
MultiTask: The word 秋 appears 20 times in the document.
BUILD SUCCESSFUL (total time: 3 seconds)
我們不去註釋掉 DocumentTask.java文件代碼中第20行控制檯輸出內容,會打印如下信息:
run:
Document: The word 秋 appears 20 times in the initial document
rowIndexStart = 0 rowIndexEnd = 1000
******************************************
rowIndexStart = 0 rowIndexEnd = 500
rowIndexStart = 500 rowIndexEnd = 1000
MultiTask: Parallelism: 4
MultiTask: Active Threads: 2
rowIndexStart = 500 rowIndexEnd = 750
rowIndexStart = 750 rowIndexEnd = 1000
rowIndexStart = 0 rowIndexEnd = 250
rowIndexStart = 250 rowIndexEnd = 500
rowIndexStart = 500 rowIndexEnd = 625
rowIndexStart = 625 rowIndexEnd = 750
rowIndexStart = 500 rowIndexEnd = 562
rowIndexStart = 562 rowIndexEnd = 625
rowIndexStart = 500 rowIndexEnd = 531
rowIndexStart = 531 rowIndexEnd = 562
rowIndexStart = 500 rowIndexEnd = 515
rowIndexStart = 515 rowIndexEnd = 531
rowIndexStart = 500 rowIndexEnd = 507
rowIndexStart = 507 rowIndexEnd = 515
MultiTask: Task Count: 0
rowIndexStart = 0 rowIndexEnd = 125
MultiTask: Steal Count: 0
******************************************
rowIndexStart = 125 rowIndexEnd = 250
rowIndexStart = 0 rowIndexEnd = 62
rowIndexStart = 62 rowIndexEnd = 125
rowIndexStart = 0 rowIndexEnd = 31
rowIndexStart = 31 rowIndexEnd = 62
rowIndexStart = 0 rowIndexEnd = 15
rowIndexStart = 15 rowIndexEnd = 31
rowIndexStart = 0 rowIndexEnd = 7
rowIndexStart = 7 rowIndexEnd = 15
rowIndexStart = 750 rowIndexEnd = 875
rowIndexStart = 875 rowIndexEnd = 1000
rowIndexStart = 750 rowIndexEnd = 812
rowIndexStart = 812 rowIndexEnd = 875
rowIndexStart = 750 rowIndexEnd = 781
rowIndexStart = 781 rowIndexEnd = 812
rowIndexStart = 750 rowIndexEnd = 765
rowIndexStart = 765 rowIndexEnd = 781
rowIndexStart = 750 rowIndexEnd = 757
rowIndexStart = 757 rowIndexEnd = 765
rowIndexStart = 250 rowIndexEnd = 375
rowIndexStart = 375 rowIndexEnd = 500
rowIndexStart = 250 rowIndexEnd = 312
rowIndexStart = 312 rowIndexEnd = 375
rowIndexStart = 250 rowIndexEnd = 281
rowIndexStart = 281 rowIndexEnd = 312
rowIndexStart = 250 rowIndexEnd = 265
rowIndexStart = 265 rowIndexEnd = 281
rowIndexStart = 250 rowIndexEnd = 257
rowIndexStart = 257 rowIndexEnd = 265
rowIndexStart = 515 rowIndexEnd = 523
rowIndexStart = 523 rowIndexEnd = 531
rowIndexStart = 765 rowIndexEnd = 773
rowIndexStart = 15 rowIndexEnd = 23
rowIndexStart = 23 rowIndexEnd = 31
rowIndexStart = 773 rowIndexEnd = 781
rowIndexStart = 265 rowIndexEnd = 273
rowIndexStart = 273 rowIndexEnd = 281
rowIndexStart = 531 rowIndexEnd = 546
rowIndexStart = 781 rowIndexEnd = 796
rowIndexStart = 281 rowIndexEnd = 296
rowIndexStart = 31 rowIndexEnd = 46
rowIndexStart = 296 rowIndexEnd = 312
rowIndexStart = 796 rowIndexEnd = 812
rowIndexStart = 546 rowIndexEnd = 562
rowIndexStart = 531 rowIndexEnd = 538
rowIndexStart = 781 rowIndexEnd = 788
rowIndexStart = 281 rowIndexEnd = 288
rowIndexStart = 288 rowIndexEnd = 296
rowIndexStart = 46 rowIndexEnd = 62
rowIndexStart = 788 rowIndexEnd = 796
rowIndexStart = 538 rowIndexEnd = 546
rowIndexStart = 31 rowIndexEnd = 38
rowIndexStart = 38 rowIndexEnd = 46
rowIndexStart = 796 rowIndexEnd = 804
rowIndexStart = 46 rowIndexEnd = 54
rowIndexStart = 296 rowIndexEnd = 304
rowIndexStart = 304 rowIndexEnd = 312
rowIndexStart = 546 rowIndexEnd = 554
rowIndexStart = 554 rowIndexEnd = 562
rowIndexStart = 54 rowIndexEnd = 62
rowIndexStart = 804 rowIndexEnd = 812
rowIndexStart = 312 rowIndexEnd = 343
rowIndexStart = 343 rowIndexEnd = 375
rowIndexStart = 312 rowIndexEnd = 327
rowIndexStart = 327 rowIndexEnd = 343
rowIndexStart = 312 rowIndexEnd = 319
rowIndexStart = 319 rowIndexEnd = 327
rowIndexStart = 812 rowIndexEnd = 843
rowIndexStart = 843 rowIndexEnd = 875
rowIndexStart = 812 rowIndexEnd = 827
rowIndexStart = 562 rowIndexEnd = 593
rowIndexStart = 593 rowIndexEnd = 625
rowIndexStart = 62 rowIndexEnd = 93
rowIndexStart = 93 rowIndexEnd = 125
rowIndexStart = 562 rowIndexEnd = 577
rowIndexStart = 577 rowIndexEnd = 593
rowIndexStart = 562 rowIndexEnd = 569
rowIndexStart = 569 rowIndexEnd = 577
rowIndexStart = 827 rowIndexEnd = 843
rowIndexStart = 62 rowIndexEnd = 77
rowIndexStart = 77 rowIndexEnd = 93
rowIndexStart = 812 rowIndexEnd = 819
rowIndexStart = 819 rowIndexEnd = 827
rowIndexStart = 62 rowIndexEnd = 69
rowIndexStart = 69 rowIndexEnd = 77
rowIndexStart = 327 rowIndexEnd = 335
rowIndexStart = 335 rowIndexEnd = 343
rowIndexStart = 827 rowIndexEnd = 835
rowIndexStart = 835 rowIndexEnd = 843
rowIndexStart = 577 rowIndexEnd = 585
rowIndexStart = 585 rowIndexEnd = 593
rowIndexStart = 77 rowIndexEnd = 85
rowIndexStart = 85 rowIndexEnd = 93
rowIndexStart = 343 rowIndexEnd = 359
rowIndexStart = 359 rowIndexEnd = 375
rowIndexStart = 343 rowIndexEnd = 351
rowIndexStart = 351 rowIndexEnd = 359
rowIndexStart = 593 rowIndexEnd = 609
rowIndexStart = 609 rowIndexEnd = 625
rowIndexStart = 593 rowIndexEnd = 601
rowIndexStart = 601 rowIndexEnd = 609
rowIndexStart = 843 rowIndexEnd = 859
rowIndexStart = 859 rowIndexEnd = 875
rowIndexStart = 843 rowIndexEnd = 851
rowIndexStart = 851 rowIndexEnd = 859
rowIndexStart = 93 rowIndexEnd = 109
rowIndexStart = 109 rowIndexEnd = 125
rowIndexStart = 93 rowIndexEnd = 101
rowIndexStart = 101 rowIndexEnd = 109
******************************************
MultiTask: Parallelism: 4
MultiTask: Active Threads: 4
MultiTask: Task Count: 34
MultiTask: Steal Count: 0
******************************************
rowIndexStart = 359 rowIndexEnd = 367
rowIndexStart = 367 rowIndexEnd = 375
rowIndexStart = 609 rowIndexEnd = 617
rowIndexStart = 859 rowIndexEnd = 867
rowIndexStart = 867 rowIndexEnd = 875
rowIndexStart = 617 rowIndexEnd = 625
rowIndexStart = 109 rowIndexEnd = 117
rowIndexStart = 117 rowIndexEnd = 125
rowIndexStart = 375 rowIndexEnd = 437
rowIndexStart = 437 rowIndexEnd = 500
rowIndexStart = 375 rowIndexEnd = 406
rowIndexStart = 406 rowIndexEnd = 437
rowIndexStart = 375 rowIndexEnd = 390
rowIndexStart = 390 rowIndexEnd = 406
rowIndexStart = 375 rowIndexEnd = 382
rowIndexStart = 382 rowIndexEnd = 390
rowIndexStart = 625 rowIndexEnd = 687
rowIndexStart = 875 rowIndexEnd = 937
rowIndexStart = 937 rowIndexEnd = 1000
rowIndexStart = 875 rowIndexEnd = 906
rowIndexStart = 906 rowIndexEnd = 937
rowIndexStart = 687 rowIndexEnd = 750
rowIndexStart = 875 rowIndexEnd = 890
rowIndexStart = 890 rowIndexEnd = 906
rowIndexStart = 875 rowIndexEnd = 882
rowIndexStart = 882 rowIndexEnd = 890
rowIndexStart = 625 rowIndexEnd = 656
rowIndexStart = 656 rowIndexEnd = 687
rowIndexStart = 625 rowIndexEnd = 640
rowIndexStart = 640 rowIndexEnd = 656
rowIndexStart = 625 rowIndexEnd = 632
rowIndexStart = 632 rowIndexEnd = 640
rowIndexStart = 125 rowIndexEnd = 187
rowIndexStart = 187 rowIndexEnd = 250
rowIndexStart = 125 rowIndexEnd = 156
rowIndexStart = 156 rowIndexEnd = 187
rowIndexStart = 125 rowIndexEnd = 140
rowIndexStart = 140 rowIndexEnd = 156
rowIndexStart = 125 rowIndexEnd = 132
rowIndexStart = 132 rowIndexEnd = 140
rowIndexStart = 390 rowIndexEnd = 398
rowIndexStart = 398 rowIndexEnd = 406
rowIndexStart = 890 rowIndexEnd = 898
rowIndexStart = 898 rowIndexEnd = 906
rowIndexStart = 640 rowIndexEnd = 648
rowIndexStart = 648 rowIndexEnd = 656
rowIndexStart = 140 rowIndexEnd = 148
rowIndexStart = 148 rowIndexEnd = 156
rowIndexStart = 406 rowIndexEnd = 421
rowIndexStart = 421 rowIndexEnd = 437
rowIndexStart = 406 rowIndexEnd = 413
rowIndexStart = 413 rowIndexEnd = 421
rowIndexStart = 656 rowIndexEnd = 671
rowIndexStart = 671 rowIndexEnd = 687
rowIndexStart = 906 rowIndexEnd = 921
rowIndexStart = 921 rowIndexEnd = 937
rowIndexStart = 656 rowIndexEnd = 663
rowIndexStart = 663 rowIndexEnd = 671
rowIndexStart = 906 rowIndexEnd = 913
rowIndexStart = 913 rowIndexEnd = 921
rowIndexStart = 156 rowIndexEnd = 171
rowIndexStart = 171 rowIndexEnd = 187
rowIndexStart = 156 rowIndexEnd = 163
rowIndexStart = 163 rowIndexEnd = 171
rowIndexStart = 421 rowIndexEnd = 429
rowIndexStart = 429 rowIndexEnd = 437
rowIndexStart = 671 rowIndexEnd = 679
rowIndexStart = 679 rowIndexEnd = 687
rowIndexStart = 921 rowIndexEnd = 929
rowIndexStart = 929 rowIndexEnd = 937
rowIndexStart = 171 rowIndexEnd = 179
rowIndexStart = 179 rowIndexEnd = 187
rowIndexStart = 937 rowIndexEnd = 968
rowIndexStart = 968 rowIndexEnd = 1000
rowIndexStart = 437 rowIndexEnd = 468
rowIndexStart = 468 rowIndexEnd = 500
rowIndexStart = 687 rowIndexEnd = 718
rowIndexStart = 718 rowIndexEnd = 750
rowIndexStart = 437 rowIndexEnd = 452
rowIndexStart = 452 rowIndexEnd = 468
rowIndexStart = 937 rowIndexEnd = 952
rowIndexStart = 952 rowIndexEnd = 968
rowIndexStart = 437 rowIndexEnd = 444
rowIndexStart = 444 rowIndexEnd = 452
rowIndexStart = 687 rowIndexEnd = 702
rowIndexStart = 937 rowIndexEnd = 944
rowIndexStart = 702 rowIndexEnd = 718
rowIndexStart = 687 rowIndexEnd = 694
rowIndexStart = 694 rowIndexEnd = 702
rowIndexStart = 944 rowIndexEnd = 952
rowIndexStart = 187 rowIndexEnd = 218
rowIndexStart = 218 rowIndexEnd = 250
rowIndexStart = 187 rowIndexEnd = 202
rowIndexStart = 202 rowIndexEnd = 218
rowIndexStart = 187 rowIndexEnd = 194
rowIndexStart = 194 rowIndexEnd = 202
******************************************
MultiTask: Parallelism: 4
MultiTask: Active Threads: 4
MultiTask: Task Count: 30
MultiTask: Steal Count: 0
******************************************
rowIndexStart = 452 rowIndexEnd = 460
rowIndexStart = 460 rowIndexEnd = 468
rowIndexStart = 702 rowIndexEnd = 710
rowIndexStart = 710 rowIndexEnd = 718
rowIndexStart = 952 rowIndexEnd = 960
rowIndexStart = 960 rowIndexEnd = 968
rowIndexStart = 202 rowIndexEnd = 210
rowIndexStart = 210 rowIndexEnd = 218
rowIndexStart = 468 rowIndexEnd = 484
rowIndexStart = 484 rowIndexEnd = 500
rowIndexStart = 468 rowIndexEnd = 476
rowIndexStart = 476 rowIndexEnd = 484
rowIndexStart = 968 rowIndexEnd = 984
rowIndexStart = 984 rowIndexEnd = 1000
rowIndexStart = 968 rowIndexEnd = 976
rowIndexStart = 976 rowIndexEnd = 984
rowIndexStart = 718 rowIndexEnd = 734
rowIndexStart = 734 rowIndexEnd = 750
rowIndexStart = 718 rowIndexEnd = 726
rowIndexStart = 726 rowIndexEnd = 734
rowIndexStart = 218 rowIndexEnd = 234
rowIndexStart = 234 rowIndexEnd = 250
rowIndexStart = 218 rowIndexEnd = 226
rowIndexStart = 226 rowIndexEnd = 234
rowIndexStart = 984 rowIndexEnd = 992
rowIndexStart = 992 rowIndexEnd = 1000
rowIndexStart = 484 rowIndexEnd = 492
rowIndexStart = 492 rowIndexEnd = 500
rowIndexStart = 734 rowIndexEnd = 742
rowIndexStart = 742 rowIndexEnd = 750
rowIndexStart = 234 rowIndexEnd = 242
rowIndexStart = 242 rowIndexEnd = 250
MultiTask: The word 秋 appears 20 times in the document.
BUILD SUCCESSFUL (total time: 3 seconds)