Tan115's picture
Add files using upload-large-folder tool
1b558aa verified
Raw
History Blame Contribute Delete
23.5 kB
1
00:00:05,000 --> 00:00:10,000
Hello there, students, in this lesson, we are going to learn with your fork join framework, we'll
2
00:00:10,000 --> 00:00:16,000
start from the high level overview of your framework and understanding of its basic principles.
3
00:00:17,000 --> 00:00:20,000
One will understand the theory of Forkin and Journey.
4
00:00:20,000 --> 00:00:24,000
We would jump straight to the source code to learn first joint pool class.
5
00:00:24,000 --> 00:00:30,000
I've explained what works to an algorithm is after that we are going to have practical code examples
6
00:00:30,000 --> 00:00:36,000
and I will show you how to submit tasks for execution with the help of furniture and pool will review
7
00:00:36,000 --> 00:00:39,000
recursive action and recursive type tasks.
8
00:00:40,000 --> 00:00:45,000
And at the end of the lesson we are going to discuss drawbacks of Thorbjoern framework that we need
9
00:00:45,000 --> 00:00:49,000
to be aware of for making a decision about its usage.
10
00:00:49,000 --> 00:00:53,000
Let's start from understanding what Furbies during the framework is.
11
00:00:53,000 --> 00:00:56,000
The first time it was presented in Java version seven.
12
00:00:57,000 --> 00:00:58,000
Why it was needed.
13
00:00:58,000 --> 00:01:03,000
The framework helps to speed up parallel processing by using all available course.
14
00:01:03,000 --> 00:01:08,000
It is designed for work that can be broken into smaller pieces recursively.
15
00:01:09,000 --> 00:01:14,000
The goal is to use all the available processing power to enhance the performance of your application.
16
00:01:15,000 --> 00:01:20,000
Why it is called for joins and it is named after the way how it works.
17
00:01:20,000 --> 00:01:27,000
The Framework X recursively breaking the task into smaller independent subtasks until they're simple
18
00:01:27,000 --> 00:01:29,000
enough to be executed asynchronously.
19
00:01:30,000 --> 00:01:35,000
And after that result of all subtasks, I recursively journey into a single result.
20
00:01:36,000 --> 00:01:37,000
This is due in part.
21
00:01:38,000 --> 00:01:40,000
That's why the framework is called for.
22
00:01:40,000 --> 00:01:42,000
Join the Fork.
23
00:01:42,000 --> 00:01:45,000
Join Framework distributes tasks to various threads in the thread.
24
00:01:45,000 --> 00:01:50,000
Pull workers that are sleeping or waiting, not actually sleeping and waiting.
25
00:01:50,000 --> 00:01:57,000
They're working on other smaller tasks for joint users work stealing algorithm workers.
26
00:01:57,000 --> 00:02:03,000
Threads that run out of things to do can steal tasks from other threats that are still busy.
27
00:02:03,000 --> 00:02:08,000
For example, doesn't create a separate thread for every single subtask.
28
00:02:08,000 --> 00:02:12,000
Instead, each threatened ZAPU has its own double ended.
29
00:02:12,000 --> 00:02:15,000
Q Modak, which stauss tasks.
30
00:02:16,000 --> 00:02:17,000
Let's talk a little bit more about work.
31
00:02:17,000 --> 00:02:19,000
Stulen algorithm.
32
00:02:19,000 --> 00:02:26,000
If I could add a simple thread that if we try to steal work from decks of business threats by default,
33
00:02:26,000 --> 00:02:30,000
every threat gets tasks from the head of its own deck.
34
00:02:30,000 --> 00:02:37,000
When it is empty, the threat takes that task from the tail of the deck of another business threat or
35
00:02:37,000 --> 00:02:39,000
from the global entry queue.
36
00:02:39,000 --> 00:02:45,000
Since this is who has the biggest pieces of work are likely to be located today, we're going to review
37
00:02:45,000 --> 00:02:48,000
a lot of JDK source code and code examples.
38
00:02:48,000 --> 00:02:50,000
So let me start screen sharing.
39
00:02:51,000 --> 00:02:58,000
The center of Fergin framework is, for example, Class I open source code of this class similar to
40
00:02:58,000 --> 00:02:59,000
Oza Executor's.
41
00:02:59,000 --> 00:03:07,000
It extends abasic executive service class that in turn implements executer service allsorts in the CPU
42
00:03:07,000 --> 00:03:14,000
attempt to find and execute tasks submitted to the CPU and or created by other active tasks that that
43
00:03:15,000 --> 00:03:16,000
a blocked or waiting.
44
00:03:16,000 --> 00:03:17,000
At the moment.
45
00:03:17,000 --> 00:03:24,000
This enables efficient processing when most tasks spawn other subtasks, as well as when many small
46
00:03:24,000 --> 00:03:27,000
tasks are submitted to the CPU from external clients.
47
00:03:27,000 --> 00:03:29,000
Let me open now.
48
00:03:29,000 --> 00:03:32,000
For example, demo class I created IT.
49
00:03:32,000 --> 00:03:38,000
Infrastructure and package done for you will be able to find the reference to the source code in attachments
50
00:03:38,000 --> 00:03:39,000
to the lesson.
51
00:03:39,000 --> 00:03:42,000
I am going to walk you through each line in this demo file.
52
00:03:43,000 --> 00:03:47,000
The first thing that we do here is create an offer of joint pull object.
53
00:03:48,000 --> 00:03:50,000
We can do this in different ways.
54
00:03:50,000 --> 00:03:53,000
The first one is to use Static Masset Common Pool.
55
00:03:53,000 --> 00:03:56,000
This will provide a reference to the common pool.
56
00:03:56,000 --> 00:04:03,000
This pool and any ongoing process are automatically terminated upon program termination in case we'll
57
00:04:03,000 --> 00:04:05,000
call X method of system class, for example.
58
00:04:06,000 --> 00:04:11,000
Another way to create an instance of, for example, is just call upon the constructor.
59
00:04:11,000 --> 00:04:14,000
The int parameter describes parallelism level.
60
00:04:14,000 --> 00:04:21,000
This level indicates how many threads or CPUs you want to work concurrently on tasks past the function
61
00:04:21,000 --> 00:04:22,000
pool.
62
00:04:22,000 --> 00:04:25,000
In this case we have parallel is level of four.
63
00:04:26,000 --> 00:04:29,000
We can create four adjourned without passing in value.
64
00:04:29,000 --> 00:04:35,000
In this case, parallelism is equal to the end value that is returned by available processers.
65
00:04:35,000 --> 00:04:42,000
Masset they remember in previous lesson I showed you a verbal processor that we can call on the runtime
66
00:04:42,000 --> 00:04:46,000
object to define the number of processing, of course, we have on the machine.
67
00:04:47,000 --> 00:04:53,000
Basically, if you don't have any specific reasons to set specific level of parallelism, you may use
68
00:04:53,000 --> 00:04:54,000
default constructor.
69
00:04:54,000 --> 00:05:00,000
Also, there is another constructor that allows it to pass to the constructor, sweat factory and error
70
00:05:00,000 --> 00:05:00,000
handler.
71
00:05:01,000 --> 00:05:03,000
Well, would you review similar example?
72
00:05:03,000 --> 00:05:09,000
Also, sweat factory in previous lesson and another argument of type, unquote, exception handler is
73
00:05:09,000 --> 00:05:15,000
a functional interface that requires you to implement logic of handling exceptional cases during the
74
00:05:15,000 --> 00:05:16,000
execution.
75
00:05:16,000 --> 00:05:19,000
It will depend on how you would like to address the exception.
76
00:05:20,000 --> 00:05:27,000
Now we can proceed with submitting a task to our executer, similar to Oprah as examples with Runnable
77
00:05:27,000 --> 00:05:32,000
and Kobel, we can submit two types of tasks actions and tasks.
78
00:05:32,000 --> 00:05:33,000
Action.
79
00:05:33,000 --> 00:05:37,000
This is something one doesn't return any value after execution.
80
00:05:37,000 --> 00:05:42,000
Just set of instructions that needs to be executed in a separate sweat and task.
81
00:05:43,000 --> 00:05:47,000
It is a type that will change the result of the execution similar to callable type.
82
00:05:48,000 --> 00:05:54,000
Recursive action is a type that will not return as a result of the execution and objects of recursive
83
00:05:54,000 --> 00:05:56,000
task type will return result of execution.
84
00:05:57,000 --> 00:06:03,000
Most of them has an absolute mass compute in which the task logic is defined also.
85
00:06:03,000 --> 00:06:06,000
Most of these types extends for the joint task.
86
00:06:06,000 --> 00:06:09,000
Let's review examples with each of these types.
87
00:06:10,000 --> 00:06:15,000
But before we jump to review code example, let me share a basic template for our tasks.
88
00:06:16,000 --> 00:06:16,000
On the slide.
89
00:06:16,000 --> 00:06:18,000
You can see pseudocode.
90
00:06:19,000 --> 00:06:27,000
If my portion of the work is small enough, does it work directly or else split my work into two pieces
91
00:06:27,000 --> 00:06:30,000
in one of the two pieces and wait for the results?
92
00:06:30,000 --> 00:06:33,000
That is how we should implement compute method.
93
00:06:34,000 --> 00:06:39,000
There should be some conditions that will tell us whether we can proceed with the execution directly
94
00:06:39,000 --> 00:06:40,000
or we should create some.
95
00:06:41,000 --> 00:06:43,000
Now let's look at the good example.
96
00:06:44,000 --> 00:06:50,000
So as you may already understand, recursive action is just a set of instructions that are needed to
97
00:06:50,000 --> 00:06:50,000
be done.
98
00:06:51,000 --> 00:06:57,000
And recursive action may still need to break up its work into smaller chunks, which can be executed
99
00:06:57,000 --> 00:06:59,000
by independent threads or CPU's.
100
00:07:00,000 --> 00:07:04,000
Recursive action is an absolute class that extends for joint task.
101
00:07:04,000 --> 00:07:11,000
So to create an object of this type, we need to have concrete implementation of this type in a separate
102
00:07:11,000 --> 00:07:16,000
file of default recursive action clause that extends recursive action.
103
00:07:16,000 --> 00:07:22,000
This is not a very meaningful example, but I decided to keep it super simple in order you would understand
104
00:07:22,000 --> 00:07:22,000
how it works.
105
00:07:23,000 --> 00:07:26,000
We have private in the field with named workload.
106
00:07:26,000 --> 00:07:32,000
We would initialize it with some value during the default recursive action object instantiation.
107
00:07:32,000 --> 00:07:38,000
And here is implementation of our compute method like you saw in template implementation.
108
00:07:38,000 --> 00:07:38,000
On the slide.
109
00:07:39,000 --> 00:07:44,000
We start with definition of a condition that should describe what we are going to proceed with.
110
00:07:44,000 --> 00:07:44,000
Action.
111
00:07:44,000 --> 00:07:49,000
Execution was a threat and one we should split our action into multiple subtasks.
112
00:07:50,000 --> 00:07:57,000
In this case, we check if the workload value is less than 18, 18 in this case is a random threshold.
113
00:07:58,000 --> 00:08:05,000
Just for the sake of example, when workload is less than 18, we just pursued action execution in the
114
00:08:05,000 --> 00:08:05,000
same thread.
115
00:08:06,000 --> 00:08:13,000
But in case it is equal to itchin or more, then we jump to our section where we create subtasks and
116
00:08:13,000 --> 00:08:14,000
call for massive.
117
00:08:14,000 --> 00:08:19,000
Here you can see two alternative ways how to achieve the same result.
118
00:08:19,000 --> 00:08:25,000
We can create subtasks and call for method for each subtask like you can see in the foreach loop.
119
00:08:25,000 --> 00:08:33,000
Or alternatively, we can use for a joint task class and call invoke all method and pass all subtasks
120
00:08:33,000 --> 00:08:35,000
that the result would be the same.
121
00:08:36,000 --> 00:08:41,000
I decided to keep for each loop here because the visualization is better in this case.
122
00:08:41,000 --> 00:08:46,000
Let's understand how we create subtasks basically for our template.
123
00:08:46,000 --> 00:08:50,000
We split my work into two pieces here.
124
00:08:50,000 --> 00:08:57,000
You can see that I create two objects of the same action type and in constructor I pass workload divided
125
00:08:57,000 --> 00:08:57,000
by two.
126
00:08:58,000 --> 00:09:02,000
I add all subtasks to the release and return it from the method.
127
00:09:02,000 --> 00:09:09,000
We use this list and for each loop or in invoke all Masset to submit this action for execution.
128
00:09:09,000 --> 00:09:11,000
Let's get back to the, for example, demo class.
129
00:09:12,000 --> 00:09:18,000
I just create an instance of my default recursive action and I pass it to the constructor.
130
00:09:18,000 --> 00:09:22,000
I call invoke method and pass the reference to my action object.
131
00:09:23,000 --> 00:09:28,000
Let's run this program and you can see that I split the workload and created two subtasks.
132
00:09:29,000 --> 00:09:34,000
To sum it up, in your action task, you need to find a way to reflect the total amount of work.
133
00:09:35,000 --> 00:09:40,000
Also, you need to define suitable thresholds that will be used to split action in subtasks.
134
00:09:40,000 --> 00:09:41,000
Like another example.
135
00:09:41,000 --> 00:09:45,000
This can be separate Masset that knows how to divide the work.
136
00:09:46,000 --> 00:09:51,000
And in implementation of compute method, you should describe the conditions that would define what
137
00:09:51,000 --> 00:09:55,000
it is time to split work into subtasks or proceed with execution.
138
00:09:56,000 --> 00:09:58,000
Hope that it is clear.
139
00:09:58,000 --> 00:10:02,000
Now let's look at the second type of tasks that we can submit into.
140
00:10:02,000 --> 00:10:10,000
For example, now we are going to recursive task, recursive task is also APSA class that extends for
141
00:10:10,000 --> 00:10:11,000
a joint task.
142
00:10:11,000 --> 00:10:16,000
We want to submit a recursive task when we want to get the result of the calculation and the response.
143
00:10:16,000 --> 00:10:22,000
The logic of interaction with objects of this type is similar was on the one difference.
144
00:10:22,000 --> 00:10:26,000
We have to join the results of computation from different set tasks.
145
00:10:26,000 --> 00:10:33,000
Let me open default recursive task class that extends recursive tasks and that implements compute method.
146
00:10:33,000 --> 00:10:39,000
As you can see, we have similar constructor and the same field as we had in recursive action.
147
00:10:39,000 --> 00:10:46,000
In case our condition tells us that we shouldn't split activity in different tasks, we just return
148
00:10:46,000 --> 00:10:46,000
the result.
149
00:10:47,000 --> 00:10:52,000
In this example, we just want to get values that twice the original value in the case.
150
00:10:52,000 --> 00:10:54,000
We need to split our work into subtasks.
151
00:10:55,000 --> 00:11:00,000
We do this, but also we need to join the results of all subtasks.
152
00:11:00,000 --> 00:11:06,000
I call Gern Masset on each subtask that's supposed to return the result of computation.
153
00:11:06,000 --> 00:11:12,000
I aggregate result in one variable and after that I return the result to them.
154
00:11:12,000 --> 00:11:15,000
This case I have, for example, demo two class.
155
00:11:15,000 --> 00:11:20,000
I create an instance of, for example, and call invoke method.
156
00:11:20,000 --> 00:11:25,000
I pass an instance of the false recursive task with workload 40.
157
00:11:25,000 --> 00:11:28,000
I run the program and Incans so output.
158
00:11:28,000 --> 00:11:31,000
You can see that I get 80 as a result.
159
00:11:32,000 --> 00:11:34,000
That is exactly what my task is supposed to do.
160
00:11:35,000 --> 00:11:35,000
Great.
161
00:11:36,000 --> 00:11:39,000
Is it clear for you how the recursive action and recursive task work?
162
00:11:40,000 --> 00:11:45,000
If yes, then we are good to proceed in case the things that are still not clear.
163
00:11:45,000 --> 00:11:49,000
Please leave your question under the switch and I will be happy to answer.
164
00:11:50,000 --> 00:11:56,000
Now we are going to learn more about such factory method from executor's class as new for stealing pool
165
00:11:56,000 --> 00:11:56,000
pull.
166
00:11:57,000 --> 00:12:04,000
This method is overloaded and has versions within parameter and without parameters in the source code
167
00:12:04,000 --> 00:12:05,000
of executor's class.
168
00:12:05,000 --> 00:12:11,000
You can see that this is nothing more than, for example, instantiate that with a specific level of
169
00:12:11,000 --> 00:12:18,000
parallelism or with the default level of parallelism that is equal to the number of available processors
170
00:12:18,000 --> 00:12:19,000
and how to work with.
171
00:12:19,000 --> 00:12:25,000
For example, you already know and we reviewed examples, I believe that you already understood potential
172
00:12:25,000 --> 00:12:32,000
benefits that we expect to get from, for example, effective usage of all course, by splitting tasks
173
00:12:32,000 --> 00:12:35,000
into subtasks, supposed to improve performance.
174
00:12:35,000 --> 00:12:38,000
But we would help us in all cases.
175
00:12:38,000 --> 00:12:44,000
Let's talk about disadvantages of, for example, probably after this lesson, you got an impression
176
00:12:44,000 --> 00:12:50,000
that Fork Join framework is something extremely cool, efficient and super fast.
177
00:12:50,000 --> 00:12:54,000
Probably even started to think that you have to use it.
178
00:12:54,000 --> 00:12:55,000
Most often.
179
00:12:55,000 --> 00:12:59,000
The evolution of Fergin pool vary between different engineers.
180
00:13:00,000 --> 00:13:03,000
Not everyone agreed and shared benefits of this type.
181
00:13:04,000 --> 00:13:09,000
If you would search the Internet pros and cons of, for example, you would discover that a group of
182
00:13:09,000 --> 00:13:15,000
people who doesn't like, for example, because of different reasons on the slide, you can see the
183
00:13:15,000 --> 00:13:20,000
list of the issues and drawbacks of, for example, based on different people opinion.
184
00:13:21,000 --> 00:13:25,000
So it makes sense in some degree and in my opinion, worse to share with you.
185
00:13:26,000 --> 00:13:30,000
So the drawbacks of, for example, are a faulty task manager.
186
00:13:31,000 --> 00:13:36,000
The foraging technique splits the work into fragments and joins the results together.
187
00:13:37,000 --> 00:13:44,000
And some practice that allows an intermediate joint for each fork can only work successfully in a controlled
188
00:13:44,000 --> 00:13:44,000
environment.
189
00:13:45,000 --> 00:13:52,000
A fatal flaw with Fergin framework by opinion of some group of people is that it is trying to manage
190
00:13:52,000 --> 00:13:53,000
and intimidate.
191
00:13:53,000 --> 00:13:56,000
Join in a task outside of a controlled environment.
192
00:13:56,000 --> 00:14:04,000
Only the operating system as c the operating system can manage and intimidate join in the task and usually
193
00:14:04,000 --> 00:14:09,000
there is a problem of errors, exceptions in subsequently FEG tasks.
194
00:14:09,000 --> 00:14:14,000
And the answer to most of the cases that may happen in real life is uncertainty.
195
00:14:15,000 --> 00:14:21,000
But this is not why people choose drama when we want to create robust application within the tools and
196
00:14:21,000 --> 00:14:23,000
techniques to deal with uncertainties.
197
00:14:24,000 --> 00:14:31,000
Inefficient, since all four tasks go into the same work as Red Deck, this team in various threads
198
00:14:31,000 --> 00:14:35,000
will fight each other at the top of the deck over the four tasks.
199
00:14:36,000 --> 00:14:42,000
This framework can never function efficiently in high performance environment, special purpose.
200
00:14:43,000 --> 00:14:46,000
There are some restrictions to follow to make sure we can benefit from using.
201
00:14:46,000 --> 00:14:51,000
For example, recommended restrictions must be plain.
202
00:14:51,000 --> 00:14:58,000
That is mean between one hundred and ten thousand basic computational steps in the compute masset compute
203
00:14:58,000 --> 00:14:59,000
intensive code only.
204
00:15:00,000 --> 00:15:02,000
No blockin, no input.
205
00:15:02,000 --> 00:15:10,000
Output, no synchronization, slow and unscalable, only works well on a small number of processors,
206
00:15:10,000 --> 00:15:14,000
this design can never scale to hundreds or thousands of processors.
207
00:15:15,000 --> 00:15:23,000
The overhead and reservation would nullify the benefits of additional processors exceedingly complex.
208
00:15:23,000 --> 00:15:26,000
You can spend more time if you wish to investigate.
209
00:15:26,000 --> 00:15:32,000
The source code of Thorbjoern framework was all Nasta types and how it is connected with the rest of
210
00:15:32,000 --> 00:15:34,000
concurrent tools and JDK.
211
00:15:34,000 --> 00:15:41,000
And you would agree that this is not the easiest and clear for understanding piece of JDK lacking in
212
00:15:41,000 --> 00:15:42,000
professional attributes.
213
00:15:42,000 --> 00:15:48,000
As a professional software engineer, as we always striving for excellence and following the best practices
214
00:15:48,000 --> 00:15:53,000
some of them are, programs fail usually as a worst possible time.
215
00:15:53,000 --> 00:15:57,000
Consequently, error recovery is paramount.
216
00:15:57,000 --> 00:16:00,000
Software needs Deunan balancing of resources.
217
00:16:01,000 --> 00:16:08,000
Administrators sometimes need classification, also called alerting logs and necessary.
218
00:16:08,000 --> 00:16:12,000
The software should be useful across a wide range of computer needs.
219
00:16:13,000 --> 00:16:18,000
The Fork Join Framework has none of this inadequate in scope.
220
00:16:18,000 --> 00:16:25,000
The forging framework is only designed to work in a trivial segment of the computing world on Java standards
221
00:16:25,000 --> 00:16:28,000
addition only on high performance workstations.
222
00:16:28,000 --> 00:16:36,000
Six plus CPUs without high persuading do not compute, only work with no task input output, no Intertrust
223
00:16:36,000 --> 00:16:38,000
concurrency and no networking.
224
00:16:39,000 --> 00:16:43,000
So this is just some of the criticism against for of joint pool.
225
00:16:44,000 --> 00:16:48,000
At the end of the day, it will be up to you how often and when to use it.
226
00:16:48,000 --> 00:16:52,000
And now you have all necessary information to make this decision.
227
00:16:52,000 --> 00:16:55,000
Let's recap what we have learned in this lesson.
228
00:16:55,000 --> 00:17:01,000
In this lesson we learned what Fork Join framework is now, you know, the main masses of, for example,
229
00:17:01,000 --> 00:17:03,000
class in the lesson.
230
00:17:03,000 --> 00:17:10,000
We had some examples where the recursive action and recursive task, we executed these types of tasks
231
00:17:10,000 --> 00:17:12,000
with the help of our gene pool.
232
00:17:12,000 --> 00:17:16,000
And at the end of the lesson, we have discussed Fergin framework drawbacks.
233
00:17:17,000 --> 00:17:18,000
That's it for this lesson.
234
00:17:18,000 --> 00:17:20,000
Thanks a lot for your attention.
235
00:17:20,000 --> 00:17:23,000
Have a great day and see you in the next lesson.