Міністерство освіти і науки України
Кіровоградський національний технічний університет
Механіко-технологічний факультет
Кафедра програмного забезпечення
Дисципліна: ПРО
Лабораторна робота №3
Тема: «Управління процесом паралельних обчислень»
Мета: Отримати навики управління процесом паралельних обчислень.
Завдання
- Створити проект.
- Вибрати колір, довжину та ширину прямокутника у відповідності з варіантом.
- Створити задачі и паралельні потоки обчислень.
- В кожному потоці обчислити площу прямокутника в пікселях.
- В окремому потоці обчислити сумарну площу прямокутників в пікселях.
- Виконати програму
Лістинг програми:
package javafxapplication3;
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Task;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.RadioButton;
import javafx.scene.control.Toggle;
import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
public class JavaFXApplication3 extends Application {
// висота та ширина сцени
private int SCENE_HEIGHT = 330;
private int SCENE_WIDTH = 350;
// висота та ширина прямокутників
private int RECTANGLE_HEIGHT = 180;
private int RECTANGLE_WIDTH = 40;
// Загаловок вікна
private String title = "Tsimbal #3";
private String radioButtonNameStart = "Старт";
private String radioButtonNameStop = "Стоп";
private int MAX_RECTANGLE_HEIGHT = RECTANGLE_HEIGHT; // максимальний розмір прямокутника
private boolean direction_flag_1 = true; // флаг інкрементації чи декрементації прямокутника
private boolean direction_flag_2 = true; // флаг інкрементації чи декрементації прямокутника
private boolean direction_flag_3 = true; // флаг інкрементації чи декрементації прямокутника
private boolean direction_flag_4 = true; // флаг інкрементації чи декрементації прямокутника
private boolean thread1CanWork = true; // флаг інкрементації чи декрементації прямокутника
private boolean thread2CanWork = true; // флаг інкрементації чи декрементації прямокутника
private boolean thread3CanWork = true; // флаг інкрементації чи декрементації прямокутника
private boolean thread4CanWork = true; // флаг інкрементації чи декрементації прямокутника
@Override
public void start(Stage primaryStage) throws InterruptedException {
Pane root = new Pane(); // створення панелі та додавання графігних елементів
final Rectangle rectangle1 = createRectangle(10, 40, RECTANGLE_WIDTH, RECTANGLE_HEIGHT, Color.BLUE); // створення прямокутника
final Text text1 = createTextLabel(10, 20); // створення текстового поля
root.getChildren().add(rectangle1);
root.getChildren().add(text1);
final Rectangle rectangle2 = createRectangle(80, 40, RECTANGLE_WIDTH, RECTANGLE_HEIGHT, Color.RED); // створення прямокутника
final Text text2 = createTextLabel(80, 20); // створення текстового поля
root.getChildren().add(rectangle2);
root.getChildren().add(text2);
final Rectangle rectangle3 = createRectangle(150, 40, RECTANGLE_WIDTH, RECTANGLE_HEIGHT, Color.YELLOW); // створення прямокутника
final Text text3 = createTextLabel(150, 20); // створення текстового поля
root.getChildren().add(rectangle3);
root.getChildren().add(text3);
final Rectangle rectangle4 = createRectangle(220, 40, RECTANGLE_WIDTH, RECTANGLE_HEIGHT, Color.GREEN); // створення прямокутника
final Text text4 = createTextLabel(220, 20); // створення текстового поля
root.getChildren().add(rectangle4);
root.getChildren().add(text4);
final Text text5 = createTextLabel(10, MAX_RECTANGLE_HEIGHT + 80); // створення текстового поля
root.getChildren().add(text5);
Scene scene = new Scene(root, SCENE_WIDTH, SCENE_HEIGHT); // створення сцени
primaryStage.setTitle(title); // встановлення заголовка
primaryStage.setScene(scene);
primaryStage.show();
// Створення тасків для потоків
final Task<Void> task1 = new Task<Void>() {
@Override
protected Void call() throws Exception {
while (true) {
Thread.sleep(10);
if (thread1CanWork) {
Platform.runLater(new Runnable() {
@Override
public void run() {
double height = rectangle1.getHeight();
if (height <= 1) {
direction_flag_1 = false;
} else if (height >= MAX_RECTANGLE_HEIGHT) {
direction_flag_1 = true;
}
if (direction_flag_1) {
height = height - 1;
} else {
height = height + 1;
}
rectangle1.setHeight(height);
text1.setText(((int) (height * rectangle1.getWidth())) + "");
}
});
}
}
}
};
// Створення тасків для потоків
final Task<Void> task2 = new Task<Void>() {
@Override
protected Void call() throws Exception {
while (true) {
Thread.sleep(15);
if (thread2CanWork) {
Platform.runLater(new Runnable() {
@Override
public void run() {
double height = rectangle2.getHeight();
if (height <= 1) {
direction_flag_2 = false;
} else if (height >= MAX_RECTANGLE_HEIGHT) {
direction_flag_2 = true;
}
if (direction_flag_2) {
height = height - 1;
} else {
height = height + 1;
}
rectangle2.setHeight(height);
text2.setText(((int) (height * rectangle2.getWidth())) + "");
}
});
}
}
}
};
// Створення тасків для потоків
final Task<Void> task3 = new Task<Void>() {
@Override
protected Void call() throws Exception {
while (true) {
Thread.sleep(20);
if (thread3CanWork) {
Platform.runLater(new Runnable() {
@Override
public void run() {
double height = rectangle3.getHeight();
if (height <= 1) {
direction_flag_3 = false;
} else if (height >= MAX_RECTANGLE_HEIGHT) {
direction_flag_3 = true;
}
if (direction_flag_3) {
height = height - 1;
} else {
height = height + 1;
}
rectangle3.setHeight(height);
text3.setText(((int) (height * rectangle3.getWidth())) + "");
}
});
}
}
}
};
// Створення тасків для потоків
final Task<Void> task4 = new Task<Void>() {
@Override
protected Void call() throws Exception {
while (true) {
Thread.sleep(25);
if (thread4CanWork) {
Platform.runLater(new Runnable() {
@Override
public void run() {
double height = rectangle4.getHeight();
if (height <= 1) {
direction_flag_4 = false;
} else if (height >= MAX_RECTANGLE_HEIGHT) {
direction_flag_4 = true;
}
if (direction_flag_4) {
height = height - 1;
} else {
height = height + 1;
}
rectangle4.setHeight(height);
text4.setText(((int) (height * rectangle4.getWidth())) + "");
}
});
}
}
}
};
// Створення тасків для потоків
final Task<Void> task5 = new Task<Void>() {
@Override
protected Void call() throws Exception {
while (true) {
Thread.sleep(10);
Platform.runLater(new Runnable() {
@Override
public void run() {
double s1 = rectangle1.getHeight() * rectangle1.getWidth();
double s2 = rectangle2.getHeight() * rectangle2.getWidth();
double s3 = rectangle3.getHeight() * rectangle3.getWidth();
double s4 = rectangle4.getHeight() * rectangle4.getWidth();
text5.setText("Сумарна площа: " + (int) (s1 + s2 + s3 + s4));
}
});
}
}
};
//Створення потоків
Thread thread1 = new Thread(task1);
thread1.start();
Thread thread2 = new Thread(task2);
thread2.start();
Thread thread3 = new Thread(task3);
thread3.start();
Thread thread4 = new Thread(task4);
thread4.start();
Thread thread5 = new Thread(task5);
thread5.start();
int contentHeight = MAX_RECTANGLE_HEIGHT + 80 + 10;
createRadioButton(root, 10, contentHeight, new ChangeListener<Toggle>() {
@Override
public void changed(ObservableValue<? extends Toggle> ov, Toggle t, Toggle t1) {
RadioButton chk = (RadioButton) t1.getToggleGroup().getSelectedToggle();
if (chk.getText().equals(radioButtonNameStart)) {
thread1CanWork = true;
} else {
thread1CanWork = false;
}
}
});
createRadioButton(root, 80, contentHeight, new ChangeListener<Toggle>() {
@Override
public void changed(ObservableValue<? extends Toggle> ov, Toggle t, Toggle t1) {
RadioButton chk = (RadioButton) t1.getToggleGroup().getSelectedToggle(); // Cast object to radio button
if (chk.getText().equals(radioButtonNameStart)) {
thread2CanWork = true;
} else {
thread2CanWork = false;
}
}
});
createRadioButton(root, 150, contentHeight, new ChangeListener<Toggle>() {
@Override
public void changed(ObservableValue<? extends Toggle> ov, Toggle t, Toggle t1) {
RadioButton chk = (RadioButton) t1.getToggleGroup().getSelectedToggle(); // Cast object to radio button
if (chk.getText().equals(radioButtonNameStart)) {
thread3CanWork = true;
} else {
thread3CanWork = false;
}
}
});
createRadioButton(root, 220, contentHeight, new ChangeListener<Toggle>() {
@Override
public void changed(ObservableValue<? extends Toggle> ov, Toggle t, Toggle t1) {
RadioButton chk = (RadioButton) t1.getToggleGroup().getSelectedToggle(); // Cast object to radio button
if (chk.getText().equals(radioButtonNameStart)) {
thread4CanWork = true;
} else {
thread4CanWork = false;
}
}
});
// створення слухача для зупинки потоків в разі натиснення кнопхи "Вихід"
primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent t) {
task1.cancel();
task2.cancel();
task3.cancel();
task4.cancel();
task5.cancel();
}
});
}
// функція для створення RadioButton
void createRadioButton(Pane root, int x, int y, ChangeListener<Toggle> changeListener) {
final ToggleGroup group = new ToggleGroup(); // створення групи для RadioButton
RadioButton rb1 = new RadioButton(radioButtonNameStart);
rb1.setToggleGroup(group);
rb1.setSelected(true);
rb1.setLayoutX(x); // встановлення Х позиції
rb1.setLayoutY(y); // встановлення У позиції
RadioButton rb2 = new RadioButton(radioButtonNameStop);
rb2.setToggleGroup(group);
rb2.setLayoutX(x); // встановлення Х позиції
rb2.setLayoutY(y + 20); // встановлення У позиції
root.getChildren().add(rb1);
root.getChildren().add(rb2);
// додавання слухача подій для зміни стану потока при написканні на RadioButton
group.selectedToggleProperty().addListener(changeListener);
}
// функція для створення прямокутника
Rectangle createRectangle(int x, int y, int w, int h, Color color) {
Rectangle r = new Rectangle(x, y, w, h);
r.setFill(color);
return r;
}
// функція для створення текстового поля
Text createTextLabel(int x, int y) {
Text localText = new Text(); //создать текст
localText.setLayoutX(x); // встановлення Х позиції
localText.setLayoutY(y); // встановлення У позиції
localText.setFont(Font.font("Arial", FontWeight.NORMAL, 15)); //встановлення шрифту
localText.setFill(Color.BLACK); //цвет текста
return localText;
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}}
Висновок: в ході даної лабораторної роботи я отримала навики управління процесом паралельних обчислень.