Технологии Java
Введение в многопоточное программирование
// Матрицы размера n×n double[][] a, b, c; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { c[i][j] = 0; for (int k = 0; k < n; k++) { c[i][j] += a[i][k] * b[k][j]; } } }
// Матрицы размера n×n /*shared*/ double[][] a, b, c; for (int i = 0; i < n; i++) { // Параллельно for (int j = 0; j < n; j++) { // Параллельно c[i][j] = 0; for (int k = 0; k < n; k++) { c[i][j] += a[i][k] * b[k][j]; } } }
worker[i] { double[] a; // a[i][⋅] double[][] b; // b[⋅][⋅] double[] c; // c[i][⋅] receive a, b from coordinator; for (int j = 0; j < n; j++) { c[j] = 0; for (int k = 0; k < n; k++) { c[j] += a[k] * b[k][j]; } } send c to coordinator; }
coordinator(int i) { double[][] a, b, c; for (int i = 0; i < n; i++) { send a[i], b to worker[i]; } for (int i = 0; i < n; i++) { receive c[i] from worker[i]; } }
worker[i] { double[] a; // a[i][⋅] double[] b; // b[⋅][i] double[] c; // c[i][⋅] receive a, b from coordinator; for (int j = 0; j < n; j++) { // Вычисление c[(i - j + n) % n] send b to worker[(i + 1) % n]; receive b from worker[(i + n - 1) % n]; } send c to coordinator; }
double integrate(double l, double r) { if (abs(area(l, m) + area(m, r) - area(l, r)) > ε) { return integrate(l, m) + integrate(m, r); } else { return area(l, m) + area(m, r); } } double area(double l, double r) { return (f(l) + f(r)) * (r - l) / 2; }
double integrate(double l, double r) { double m = (l + r) / 2; double la = area(l, m); double ra = area(m, r); if (abs(la + ra - area(l, r)) > ε) { la = integrate(l, m); // Параллельно ra = integrate(m, r); // Параллельно } return la + ra; }
〈statements〉
〈await(C) statements〉
/* shared */ int max = 0; create worker[i] { if (max < a[i]) max = a[i]; }
/* shared */ int max = 0; create worker[i] { 〈if (max < a[i]) max = a[i];〉 }
/* shared */ int max = 0; create worker[i] { if (max < a[i]) { 〈if (max < a[i]) max = a[i];〉 } }
// Создание Thread t = new Thread(() -> { System.out.println("Hello"); }); // Запуск t.start();
// Создание Thread t = new Thread() { public void run() { System.out.println("Hello"); } }; // Запуск t.start();
getState() | isAlive() |
---|---|
NEW | |
RUNNABLE | + |
BLOCKED | + |
WAITING | + |
TIMED_WAITING | + |
TERMINATED |
Runnable worker = run() -> { try { while (!Thread.interrupted()) { // Полезные действия } } catch (InterruptedException e) { // Поток заканчивает работу } finally { // Восстановление флага прерывания Thread.currentThread().interrupt(); } }