Tan115's picture
Add files using upload-large-folder tool
1b558aa verified
Raw
History Blame Contribute Delete
35.1 kB
1
00:00:05,000 --> 00:00:06,000
Hello, dissidents.
2
00:00:06,000 --> 00:00:11,000
Today, we are going to have a really interesting and useful lesson, we are going to learn how to work
3
00:00:11,000 --> 00:00:12,000
with compatible future.
4
00:00:13,000 --> 00:00:18,000
This is something what personally I use very often when I work with MultiThreaded and in my opinion,
5
00:00:18,000 --> 00:00:22,000
this class and its features underestimated and on engineers.
6
00:00:22,000 --> 00:00:28,000
So today I'm going to show you how powerful this type is and when we might use it.
7
00:00:28,000 --> 00:00:33,000
We are going to learn how to execute tasks with comfortable future during the lesson will learn the
8
00:00:33,000 --> 00:00:39,000
concept of the callback and how to work with callbacks with the help of compatible future.
9
00:00:39,000 --> 00:00:43,000
Besides that, today we are going to learn more advanced concepts.
10
00:00:44,000 --> 00:00:49,000
Namely, I'm going to show you how we can combine future objects together and work with them.
11
00:00:50,000 --> 00:00:55,000
And at the end of the lesson, we learn how to manage exceptions in complete the future.
12
00:00:55,000 --> 00:01:00,000
Let's start learning this topic with the help of official documentation and the source code.
13
00:01:00,000 --> 00:01:05,000
Let's understand first what complete the future is and what problem it solves.
14
00:01:05,000 --> 00:01:11,000
Creating multi spending programs is not an easy thing, especially it's hard to manage asynchronous
15
00:01:11,000 --> 00:01:14,000
computations and build dependencies between those.
16
00:01:15,000 --> 00:01:21,000
In case you have multiple steps in a program and each step may depend on execution of the previous step,
17
00:01:21,000 --> 00:01:27,000
you try to find out ways how to implement this and code it may end up with having multiple callbacks
18
00:01:28,000 --> 00:01:30,000
and logic may be scattered across the application.
19
00:01:31,000 --> 00:01:34,000
And what about handlin errors that happened on one of the steps?
20
00:01:35,000 --> 00:01:37,000
Should we handle the same error in different places?
21
00:01:37,000 --> 00:01:43,000
Or we can find a way to create an exception handler for multiple connected steps during Lutece writing
22
00:01:43,000 --> 00:01:43,000
processes.
23
00:01:44,000 --> 00:01:46,000
Committable Future helps us to solve this issue.
24
00:01:46,000 --> 00:01:53,000
And even more compatible future was released in Java Version eight to improve future interface.
25
00:01:53,000 --> 00:01:57,000
Future Interface was released in Java Version five.
26
00:01:57,000 --> 00:02:03,000
It was a great improvement, but its introduction doesn't solve an issue of connecting multiple tasks
27
00:02:03,000 --> 00:02:09,000
between each other and API for error handling, along with future interface composable.
28
00:02:09,000 --> 00:02:14,000
Future also implements another interface that was introduced in Java version eight.
29
00:02:15,000 --> 00:02:16,000
It is called Completion Stage.
30
00:02:17,000 --> 00:02:19,000
This time defines the context for behavior.
31
00:02:19,000 --> 00:02:26,000
For an asynchronous computation step is that we combine with other steps in the source code of this
32
00:02:26,000 --> 00:02:28,000
type and we find a lot of different methods.
33
00:02:28,000 --> 00:02:30,000
Most of them are overloaded.
34
00:02:30,000 --> 00:02:37,000
So implementation of completion, stage and future interfaces in complete the future gives us around
35
00:02:37,000 --> 00:02:43,000
50 masses available to use those methods primarily for composing, combining, executing asynchronous
36
00:02:43,000 --> 00:02:45,000
tasks and error handling.
37
00:02:46,000 --> 00:02:49,000
Let's start watching compatible future code examples.
38
00:02:49,000 --> 00:02:53,000
I create a separate package for examples only was complete the future.
39
00:02:53,000 --> 00:02:58,000
I share the length of the package with you in attachments to this in the name No.
40
00:02:58,000 --> 00:03:03,000
One, I'm going to show you the simplest and probably one of the most popular usage of compressible
41
00:03:03,000 --> 00:03:03,000
future.
42
00:03:04,000 --> 00:03:07,000
It is super easy to run asynchronous tasks with this type.
43
00:03:08,000 --> 00:03:14,000
It has multiple static masses that allow us to execute task in a separate thread without long configuration
44
00:03:14,000 --> 00:03:19,000
of a solid object or creation of executive service and shutting down it later in the case.
45
00:03:19,000 --> 00:03:22,000
I just want to execute asynchronous task.
46
00:03:22,000 --> 00:03:25,000
I just could run a static method of compostable feature class.
47
00:03:26,000 --> 00:03:26,000
That's it.
48
00:03:27,000 --> 00:03:32,000
For example, you just need to notify another service about work being started or done and you don't
49
00:03:32,000 --> 00:03:34,000
care about response from the client.
50
00:03:35,000 --> 00:03:41,000
Such a similar case cases may happen sometimes when you call around asking for joint command post is
51
00:03:41,000 --> 00:03:42,000
used.
52
00:03:42,000 --> 00:03:49,000
This approach is good for intensive and fast tasks, considering the fact when Java process is finished,
53
00:03:49,000 --> 00:03:50,000
there is no common pool.
54
00:03:50,000 --> 00:03:56,000
I put sleep here to let this thread be executed and bring this tax to consult run.
55
00:03:56,000 --> 00:03:58,000
I think massive is overloaded.
56
00:03:58,000 --> 00:04:02,000
There is a massive that takes Runnable object and executor as a method of argument.
57
00:04:03,000 --> 00:04:09,000
In the next example here, I put the same lambda function for Runnable and Executive Service, considering
58
00:04:09,000 --> 00:04:16,000
the fact that the second example here use a separate executive service and doesn't use for common pool,
59
00:04:16,000 --> 00:04:18,000
I don't need to put any sleep here.
60
00:04:18,000 --> 00:04:19,000
I'm not afraid.
61
00:04:19,000 --> 00:04:21,000
Java process termination.
62
00:04:21,000 --> 00:04:27,000
And you can see in console, thread, name and console output that imitates Sambrook that may be done
63
00:04:27,000 --> 00:04:30,000
in a separate track by the thread name.
64
00:04:30,000 --> 00:04:34,000
You can understand that surrounds is executed with the help of Fajon pull.
65
00:04:34,000 --> 00:04:39,000
Make sure you watched my lesson about, for example, if you want them more about.
66
00:04:40,000 --> 00:04:43,000
In the second case we use Red Bull executer.
67
00:04:43,000 --> 00:04:45,000
That's why Swed name is different.
68
00:04:45,000 --> 00:04:46,000
That's it.
69
00:04:46,000 --> 00:04:47,000
We're getting this example.
70
00:04:47,000 --> 00:04:48,000
Let's move on.
71
00:04:49,000 --> 00:04:55,000
The next example is related was one of the features of computable future type you can complete task
72
00:04:55,000 --> 00:04:56,000
was method.
73
00:04:56,000 --> 00:05:01,000
To be honest, I have never used this method besides learning and educational purposes.
74
00:05:01,000 --> 00:05:07,000
But this message is like one of the main sinks, incompatible future when you potentially need to use
75
00:05:07,000 --> 00:05:11,000
it, let's say you need to fetch some data from another server.
76
00:05:11,000 --> 00:05:13,000
Does this operation would take some time?
77
00:05:14,000 --> 00:05:17,000
That's why you decided to run this task in a separate thread.
78
00:05:17,000 --> 00:05:22,000
But something happened and the remote server doesn't respond for a specific amount of time.
79
00:05:23,000 --> 00:05:25,000
And you really need to proceed with execution.
80
00:05:25,000 --> 00:05:29,000
In this case, you may complete the future by returning the default value.
81
00:05:29,000 --> 00:05:34,000
Let's look at the example I want to put into console result of a asynchronous calculation.
82
00:05:35,000 --> 00:05:38,000
I call calculate calculator sink as it returns any future object.
83
00:05:39,000 --> 00:05:43,000
And considering the fact that it's completed all the future implements future interface.
84
00:05:43,000 --> 00:05:46,000
I can return composable future when needed.
85
00:05:46,000 --> 00:05:49,000
I create an instance of complete double future.
86
00:05:49,000 --> 00:05:53,000
After that I create cash, streetball and submit callable for execution.
87
00:05:54,000 --> 00:05:56,000
I imitate a call to external server.
88
00:05:57,000 --> 00:06:02,000
Imagine that I want to get some price double values that I will assign to the result variable and will
89
00:06:02,000 --> 00:06:05,000
return it by making my sleep.
90
00:06:05,000 --> 00:06:08,000
I imitate the delay in request a server.
91
00:06:09,000 --> 00:06:13,000
After that I shut down executive service and I call a termination.
92
00:06:14,000 --> 00:06:18,000
I am waiting for two seconds, only having the reference to the future object.
93
00:06:18,000 --> 00:06:22,000
I can verify whether all calculations are done or not done.
94
00:06:23,000 --> 00:06:26,000
If calculations are done, I return the reference to the future object.
95
00:06:27,000 --> 00:06:32,000
If calculations are not done, I call complete Masset on my accomplishable future object and they pass
96
00:06:32,000 --> 00:06:35,000
some default price values that I'm happy to return.
97
00:06:36,000 --> 00:06:43,000
In this case, future won't be done and we are going to have force here because we await termination
98
00:06:43,000 --> 00:06:45,000
only for two seconds.
99
00:06:45,000 --> 00:06:51,000
But we expect tasks to be completed in five seconds after call and complete Masset completed.
100
00:06:51,000 --> 00:06:56,000
All future will be considered as completed and I return the reference to the compatible future.
101
00:06:56,000 --> 00:07:02,000
When I get the reference to the future, I just called Get MassArt and I extract complete result.
102
00:07:03,000 --> 00:07:08,000
Let's run this program and you can see that in console we have nine point ninety nine.
103
00:07:08,000 --> 00:07:12,000
This is our default price and we don't get new value.
104
00:07:12,000 --> 00:07:17,000
Is it clear if no, ask question below this video and I will be happy to answer.
105
00:07:18,000 --> 00:07:20,000
If everything is clear for you, then let's proceed.
106
00:07:21,000 --> 00:07:25,000
The next example is located in the file was named Elmasry.
107
00:07:25,000 --> 00:07:27,000
This time I'm going to show your supply.
108
00:07:27,000 --> 00:07:34,000
I think similar to the run, I think said we can submit a task without boilerplate code.
109
00:07:35,000 --> 00:07:41,000
But the only difference is that in releasing we passed Runnable object and here we need to pass supplier.
110
00:07:42,000 --> 00:07:47,000
In case you're not familiar with supplier type, feel free to watch my course about functional programming
111
00:07:47,000 --> 00:07:48,000
for Java engineers.
112
00:07:49,000 --> 00:07:55,000
In that course, we have plenty of examples that will help you to understand a lot of functional interfaces,
113
00:07:55,000 --> 00:07:56,000
including supply.
114
00:07:57,000 --> 00:07:58,000
Basically, that's it.
115
00:07:59,000 --> 00:08:00,000
Supply returns the value.
116
00:08:00,000 --> 00:08:07,000
That's why I can get future after Colen supply, async and extract result from it.
117
00:08:07,000 --> 00:08:10,000
Let's run this program and print result the console.
118
00:08:11,000 --> 00:08:17,000
And as you can see in console, I managed to extract text from the future object and printed it to console.
119
00:08:17,000 --> 00:08:23,000
So feel free to use this method in case you have something to execute in a separate thread and you need
120
00:08:23,000 --> 00:08:27,000
to get the result of the execution hub that this example is clear.
121
00:08:28,000 --> 00:08:29,000
Let's move on now.
122
00:08:29,000 --> 00:08:35,000
We'll create with you a sequence of steps that should be executed one after another in a separate thread,
123
00:08:36,000 --> 00:08:42,000
because it might happen that you need to perform another action based on the previous step completion.
124
00:08:42,000 --> 00:08:48,000
So basically you can act complete about future, which should automatically get called once the future
125
00:08:48,000 --> 00:08:48,000
completes.
126
00:08:49,000 --> 00:08:51,000
Z is also often called a callback.
127
00:08:52,000 --> 00:08:55,000
It is also known as call after function.
128
00:08:55,000 --> 00:09:00,000
We have three methods that allow us to do this, then apply, then accept.
129
00:09:00,000 --> 00:09:04,000
Xinran, we're going to review examples with these methods.
130
00:09:04,000 --> 00:09:11,000
Now, let's start from then apply method in the file demo for I create super simple example to help
131
00:09:11,000 --> 00:09:13,000
easily understand how this works.
132
00:09:13,000 --> 00:09:18,000
The pardon is the same so you can apply it to any other tasks and calculations.
133
00:09:19,000 --> 00:09:26,000
Imagine that you want to fetch user iji by email from one API and once you have user ID, you can request
134
00:09:26,000 --> 00:09:33,000
total number of purchases for this user from another API and you need the result of first task execution
135
00:09:34,000 --> 00:09:41,000
to get a D in order to be able to execute the second request I call supply asking to submit my first
136
00:09:41,000 --> 00:09:41,000
task.
137
00:09:42,000 --> 00:09:49,000
Is this a supplier that produces some result and after that I call then apply method and pass a function
138
00:09:49,000 --> 00:09:56,000
that takes result of previous task execution as an input argument and that returns as a value.
139
00:09:56,000 --> 00:10:01,000
I have console output in first and in second task just to imitate.
140
00:10:02,000 --> 00:10:08,000
As a result of then applying, Masset is a future object that you can use to retrieve a result of computation
141
00:10:08,000 --> 00:10:15,000
of the last step, you can build multiple steps like this, Michael, and then apply and to use in the
142
00:10:15,000 --> 00:10:20,000
result of execution from previous step as an input argument for the next step.
143
00:10:20,000 --> 00:10:21,000
Is that clear?
144
00:10:21,000 --> 00:10:23,000
If yes, then great.
145
00:10:24,000 --> 00:10:27,000
Also, there is another similar method then apply.
146
00:10:27,000 --> 00:10:27,000
I think.
147
00:10:28,000 --> 00:10:30,000
What would be the difference between then apply and then apply?
148
00:10:30,000 --> 00:10:38,000
I think basically the main difference is the executor as it is used to execute these tasks by default,
149
00:10:38,000 --> 00:10:44,000
then apply method uses the same threat that was used by the first task and uses the same exact as it
150
00:10:44,000 --> 00:10:48,000
was defined by computable future on which it is called.
151
00:10:48,000 --> 00:10:52,000
Then apply, I think uses independent executor by default.
152
00:10:53,000 --> 00:10:59,000
It is forgery and common pool, but there is an overloaded method that allows it to pass executor service
153
00:11:00,000 --> 00:11:03,000
like in the similar example below that will bring us to the same result.
154
00:11:04,000 --> 00:11:06,000
I use executive service and then apply.
155
00:11:06,000 --> 00:11:12,000
I think Massett in general, if you have multiple tasks for execution, I would just recommend it to
156
00:11:12,000 --> 00:11:18,000
have executive service configured and use it for tasks execution that's triggered and then apply.
157
00:11:18,000 --> 00:11:20,000
Masset, let's move on.
158
00:11:20,000 --> 00:11:22,000
I open them a file file.
159
00:11:22,000 --> 00:11:28,000
So as you already understood, then apply method returns to some future object.
160
00:11:28,000 --> 00:11:33,000
But in case you don't want to create a return statement to return the result of the execution after
161
00:11:33,000 --> 00:11:40,000
the final step and you just need to have some code got executed, you have to use it and accept us run.
162
00:11:41,000 --> 00:11:42,000
We we're going to talk in a minute.
163
00:11:42,000 --> 00:11:44,000
What is the difference between these two?
164
00:11:44,000 --> 00:11:46,000
Let me just start explaining of that.
165
00:11:46,000 --> 00:11:53,000
Except first, in this case, imagine that we need to extract full and complete user profile and in
166
00:11:53,000 --> 00:11:58,000
the first step of this process, received text representation of user profile.
167
00:11:58,000 --> 00:12:05,000
And after that, I just call then accept method to perform some operations that doesn't require me to
168
00:12:05,000 --> 00:12:06,000
return the result.
169
00:12:06,000 --> 00:12:12,000
For example, just saving this information somewhere in the application, probably in the user session
170
00:12:12,000 --> 00:12:18,000
object or in local database, it doesn't matter, for example, then accept also returns compatible
171
00:12:18,000 --> 00:12:19,000
future.
172
00:12:19,000 --> 00:12:23,000
But this is compatible future that this parametrized by void type.
173
00:12:23,000 --> 00:12:29,000
In case you would try to extract value from this future, you would get no, let's run this program.
174
00:12:30,000 --> 00:12:35,000
And as you can see in console, I prefer that the console now so we can say that extract value from
175
00:12:35,000 --> 00:12:40,000
the future after Colon's and accept doesn't make a lot of sense.
176
00:12:40,000 --> 00:12:46,000
Similar to the previous example then, except MassArt has methods that allow to use separate executer
177
00:12:46,000 --> 00:12:52,000
for each step, then accept async Macit use a separate executer for tasks execution.
178
00:12:52,000 --> 00:12:53,000
Is it clear?
179
00:12:54,000 --> 00:12:59,000
Now let's look at the next example with Iran Masset and understand how it is different.
180
00:13:00,000 --> 00:13:07,000
I open domestiques, almost similar example, but in this case I just want to see user profile to another
181
00:13:07,000 --> 00:13:07,000
server.
182
00:13:08,000 --> 00:13:13,000
And once this task will be executed, I want to look that user profile has been saved, but perform
183
00:13:13,000 --> 00:13:15,000
any other actions after the first one.
184
00:13:16,000 --> 00:13:22,000
In this case, there is no need for me to call supply async because the result of computation of the
185
00:13:22,000 --> 00:13:25,000
first step will not be passed to anywhere.
186
00:13:25,000 --> 00:13:31,000
That's why it wouldn't matter at all what value will be returned from the first step of the execution.
187
00:13:31,000 --> 00:13:38,000
And after it I just called and run method to perform some actions in this case just to notify the user.
188
00:13:38,000 --> 00:13:44,000
Profile has been saved and I can proceed with other operations that were dependent on the first one.
189
00:13:45,000 --> 00:13:50,000
And again, we are future objects rechanneled, but it contains nothing in response.
190
00:13:50,000 --> 00:13:54,000
And also we have similar Massata then run, which is called Zinda Run.
191
00:13:54,000 --> 00:14:01,000
I think this method will use separate executive service either for example or the ones at the specified
192
00:14:02,000 --> 00:14:05,000
hope that you understand now how to work with these matters.
193
00:14:05,000 --> 00:14:06,000
Let's continue.
194
00:14:07,000 --> 00:14:10,000
I'd like to talk about a combination of different future objects.
195
00:14:11,000 --> 00:14:12,000
I open them.
196
00:14:12,000 --> 00:14:18,000
A seven file imagines that you already have two masses and both of them return complete the future object.
197
00:14:19,000 --> 00:14:27,000
The first method extracts user details by ID and the second method extracts credit rating by user details.
198
00:14:27,000 --> 00:14:30,000
You already know how to use and apply MassArt.
199
00:14:30,000 --> 00:14:36,000
Let's look how it would look like in this case when you would call one method and after that you would
200
00:14:36,000 --> 00:14:42,000
call another method that also the Transcom political future you would get as a result compatible future.
201
00:14:42,000 --> 00:14:44,000
That is parametrized by compatible future.
202
00:14:45,000 --> 00:14:47,000
It is not too convenient to work with the result.
203
00:14:47,000 --> 00:14:54,000
Now you should call get method twice to extract the results that you wanted, especially for such cases.
204
00:14:54,000 --> 00:14:58,000
There is a composed method in case I call them compose.
205
00:14:58,000 --> 00:15:00,000
Instead of apply, I get complete.
206
00:15:01,000 --> 00:15:03,000
Future parametrized by the time of my results.
207
00:15:04,000 --> 00:15:05,000
And that's it.
208
00:15:05,000 --> 00:15:11,000
This solution is more elegant in case you want to compose one future object out of two.
209
00:15:11,000 --> 00:15:19,000
If in those three Mapai in Java, I am sure you remember that there is such as flat map, that mass,
210
00:15:19,000 --> 00:15:20,000
it is similar to this one.
211
00:15:21,000 --> 00:15:26,000
So you can extract completely a future from another conceivable future and get flat representation of
212
00:15:26,000 --> 00:15:27,000
the result.
213
00:15:27,000 --> 00:15:31,000
Also in this case, we have one task running after another.
214
00:15:31,000 --> 00:15:33,000
So two dependent tasks.
215
00:15:33,000 --> 00:15:37,000
We have also similar methods that are called then compose a scene.
216
00:15:37,000 --> 00:15:39,000
I believe you already understand.
217
00:15:39,000 --> 00:15:41,000
What is the difference then?
218
00:15:41,000 --> 00:15:43,000
Compose a scene you separate.
219
00:15:43,000 --> 00:15:49,000
Executer let me open them are eight now in the case, two tasks are independent and you just want to
220
00:15:49,000 --> 00:15:53,000
complete two of them in any order you can call them combine.
221
00:15:53,000 --> 00:15:58,000
In this case you can perform some actions after two tasks are completed.
222
00:15:58,000 --> 00:16:02,000
So again, we have to masset that return complete double future.
223
00:16:02,000 --> 00:16:06,000
One method returns weight and another method which is height.
224
00:16:07,000 --> 00:16:10,000
Each massive sleep for one second inside.
225
00:16:10,000 --> 00:16:17,000
This is just to imitate some operation time in the main mass that we get weight in KG future, and after
226
00:16:17,000 --> 00:16:22,000
that we call them combined Masset and we pass height in centimeters future.
227
00:16:22,000 --> 00:16:29,000
That together with my function, as you remember, my function can take two arguments and returns.
228
00:16:29,000 --> 00:16:34,000
The result, these two arguments would be the result of these two future objects.
229
00:16:34,000 --> 00:16:39,000
And once we get the result, we apply the function inside the BI function.
230
00:16:39,000 --> 00:16:44,000
I want to calculate the body mass index by following a specific formula here.
231
00:16:44,000 --> 00:16:51,000
Let's run the program and you can see in concert that after and weight and height I start calculating
232
00:16:51,000 --> 00:16:52,000
body mass index.
233
00:16:53,000 --> 00:16:58,000
And the main thing here is that I don't need to have connection between execution of the first and the
234
00:16:58,000 --> 00:17:02,000
second task that can be executed in parallel.
235
00:17:02,000 --> 00:17:05,000
But I just need the result of both computations.
236
00:17:06,000 --> 00:17:12,000
And for the convention, we have then combined async method, which is overloaded and has a version
237
00:17:12,000 --> 00:17:16,000
that was default executer and was a separate executer argument.
238
00:17:16,000 --> 00:17:20,000
I open them online file and you already know that.
239
00:17:20,000 --> 00:17:25,000
Then combined, MassArt returns the result of computation of the future objects.
240
00:17:25,000 --> 00:17:32,000
We have another method that is called Xanax, Sambo's, that instead of by function takes by consumer,
241
00:17:32,000 --> 00:17:40,000
that means it doesn't return any value and just consumes the results of execution of two tasks and works
242
00:17:40,000 --> 00:17:42,000
with two future objects and return nothing.
243
00:17:43,000 --> 00:17:47,000
So in this case, you can see that I supply lambda expressions.
244
00:17:47,000 --> 00:17:48,000
It returns first.
245
00:17:48,000 --> 00:17:53,000
I call accept the both and after that I supply lambda expressions.
246
00:17:53,000 --> 00:17:57,000
It returns the second and we just bring concatenated string to consult.
247
00:17:58,000 --> 00:18:04,000
And in case I would extract the value from the future object, I would get no because then accept the
248
00:18:04,000 --> 00:18:05,000
most massive returns.
249
00:18:05,000 --> 00:18:08,000
Computable future parametrized by voit type.
250
00:18:09,000 --> 00:18:16,000
Lets run the program and you can see that I printed concatenated string the new value proofs that my
251
00:18:16,000 --> 00:18:17,000
future contains.
252
00:18:17,000 --> 00:18:21,000
Nassan also we have similar MassArt foreign conventions.
253
00:18:21,000 --> 00:18:24,000
We have then accept both async method.
254
00:18:24,000 --> 00:18:30,000
So far I've learned math that allowed us to combine only to complete the future objects.
255
00:18:31,000 --> 00:18:36,000
Now we are going to land mass that allow us to combine multiple completive of future objects.
256
00:18:37,000 --> 00:18:45,000
There are two masses of and any of both of these masses accept variable arguments of political future
257
00:18:45,000 --> 00:18:45,000
type.
258
00:18:45,000 --> 00:18:47,000
Let's review these two.
259
00:18:47,000 --> 00:18:50,000
I open them more than we have here.
260
00:18:50,000 --> 00:18:52,000
Simple, but a very interesting example.
261
00:18:53,000 --> 00:18:57,000
We are going to come up with a few more masses that I didn't share with you before.
262
00:18:57,000 --> 00:19:03,000
The goal of this example is to create a list of strings and turn them into a capital case.
263
00:19:03,000 --> 00:19:04,000
Pretty simple scenario.
264
00:19:04,000 --> 00:19:11,000
And we will solve this task with computable future, not because I love complicated things, but just
265
00:19:11,000 --> 00:19:15,000
to help you understand this example, I create a list of strings.
266
00:19:15,000 --> 00:19:22,000
After that, I create a string from this list I call Map Masset and passing functions that completed
267
00:19:22,000 --> 00:19:27,000
the future method returns and you complete the future object as it is already completed with the given
268
00:19:27,000 --> 00:19:28,000
value.
269
00:19:28,000 --> 00:19:36,000
After that, I then apply Masset for each string and invoke the late uppercase Delate uppercase sleep
270
00:19:36,000 --> 00:19:43,000
for a random amount of time, but up to one second and returns the current string in uppercase.
271
00:19:44,000 --> 00:19:50,000
This random sleep imitates operation time in case there will be more actions here.
272
00:19:50,000 --> 00:19:57,000
After that, we have a list of future objects I call all of Masset and POS array of future objects,
273
00:19:57,000 --> 00:20:00,000
considering the fact that all of Masad may accept.
274
00:20:00,000 --> 00:20:07,000
The verbal argument, all of matter will reach a new political future that is completed when all of
275
00:20:07,000 --> 00:20:10,000
the give and complete futures complete.
276
00:20:10,000 --> 00:20:17,000
But what would happen in case one of the given futures complete, exceptionally Zenzi complete political
277
00:20:17,000 --> 00:20:24,000
future also does so as a result, if any of the given political futures are not reflected in the return
278
00:20:24,000 --> 00:20:29,000
to complete the future, but may be obtained by inspecting them individually.
279
00:20:30,000 --> 00:20:33,000
After that, I call one complete MassArt.
280
00:20:33,000 --> 00:20:40,000
This message returns and you completion stage with the same result of exception as the stage and executes
281
00:20:40,000 --> 00:20:41,000
that given action.
282
00:20:41,000 --> 00:20:49,000
When this stage completes one complete takes by consumer as method argument in this by consumer receives
283
00:20:49,000 --> 00:20:56,000
the result on now if none and the exception on now if none of the stages arguments to get the results,
284
00:20:56,000 --> 00:21:00,000
we need to go over our features one more time.
285
00:21:00,000 --> 00:21:07,000
In this case, I just print each updated string to console pay attention that I could get now masset
286
00:21:07,000 --> 00:21:08,000
of complete double future.
287
00:21:09,000 --> 00:21:11,000
We didn't discuss this method yet.
288
00:21:11,000 --> 00:21:18,000
Get now returns the value if computation is finished and returns default values that we pass as a method
289
00:21:18,000 --> 00:21:20,000
argument if result is not ready.
290
00:21:20,000 --> 00:21:23,000
In our case we use one complete Macit.
291
00:21:23,000 --> 00:21:28,000
So we assume that all of the features were done by this moment in our program.
292
00:21:28,000 --> 00:21:32,000
So I print all uppercase string to consult.
293
00:21:32,000 --> 00:21:33,000
Let me run this program.
294
00:21:34,000 --> 00:21:35,000
That's it.
295
00:21:36,000 --> 00:21:43,000
Any questions regarding all of Masset leaves them under review in case of any the next them is related
296
00:21:43,000 --> 00:21:44,000
to any of method.
297
00:21:45,000 --> 00:21:47,000
Let me open them on file here.
298
00:21:47,000 --> 00:21:51,000
We have absolutely similar example, but with only one difference.
299
00:21:52,000 --> 00:21:59,000
Instead of all of I call any of method here any of Masset returns and you completed all future that
300
00:21:59,000 --> 00:22:04,000
is completed when any of the given completed will future complete.
301
00:22:04,000 --> 00:22:10,000
So in this case, the first future that will be completed will be printed to cancel.
302
00:22:10,000 --> 00:22:16,000
Let me run this program that it I have been processed first and that's it.
303
00:22:17,000 --> 00:22:19,000
Nothing else is printed to consult.
304
00:22:19,000 --> 00:22:20,000
Does it make sense?
305
00:22:20,000 --> 00:22:21,000
Great.
306
00:22:21,000 --> 00:22:22,000
Let's proceed.
307
00:22:23,000 --> 00:22:28,000
And the last, but not least for today, I am going to show you how to handle exceptions with the help
308
00:22:28,000 --> 00:22:29,000
of compatible future.
309
00:22:30,000 --> 00:22:35,000
This type allows us to handle errors in a chain of asynchronous computation steps.
310
00:22:36,000 --> 00:22:41,000
Instead of having to try catch block, we have handle Masset that receives two arguments.
311
00:22:41,000 --> 00:22:47,000
The first one is a result of computation in case all processing was finished successfully, and the
312
00:22:47,000 --> 00:22:52,000
second argument is exceptions thrown in case there was some exceptional case.
313
00:22:52,000 --> 00:22:58,000
I open them Otwell file in this file we have examples of error handling I supply.
314
00:22:58,000 --> 00:23:05,000
I think the next task I have int variables that is equal to five and I divided by zero.
315
00:23:06,000 --> 00:23:09,000
We're going to have error if we take exception in this line.
316
00:23:09,000 --> 00:23:12,000
But take into account this is a onetime exception.
317
00:23:12,000 --> 00:23:19,000
Compiler doesn't warn us about potential Hanlan, but I'm smart enough to handle Masad after the last
318
00:23:19,000 --> 00:23:19,000
step.
319
00:23:19,000 --> 00:23:23,000
And by the way, you may have multiple steps handle.
320
00:23:23,000 --> 00:23:28,000
Masset will catch exception on any step of execution in case there are no exceptions.
321
00:23:29,000 --> 00:23:35,000
Result of execution would be in the first argument and in case a recent exception, I have the reference
322
00:23:35,000 --> 00:23:40,000
to the exception object passed as a second argument that surrounds this program.
323
00:23:41,000 --> 00:23:44,000
And in console output we can see that we enter this.
324
00:23:44,000 --> 00:23:52,000
If LOC I printed the class of the exception, it is completion exception and it is caused by arithmetic
325
00:23:52,000 --> 00:23:52,000
exception.
326
00:23:53,000 --> 00:23:57,000
So we can see how a completion exception is the regional exception.
327
00:23:57,000 --> 00:23:59,000
We have also another method for error.
328
00:23:59,000 --> 00:24:00,000
Hanlan.
329
00:24:00,000 --> 00:24:02,000
It is called exceptionally.
330
00:24:02,000 --> 00:24:09,000
The difference is that it takes not by function like handle matter, but it takes function and has parameter
331
00:24:09,000 --> 00:24:16,000
of Straubel type is the same way I check exception here and considering the fact that I don't have any
332
00:24:16,000 --> 00:24:19,000
result available, I can return some default value, for example.
333
00:24:20,000 --> 00:24:21,000
That's it.
334
00:24:21,000 --> 00:24:23,000
We learned a lot about the future.
335
00:24:24,000 --> 00:24:29,000
In case there is anything else you want to know about compatible future, please ask questions.
336
00:24:29,000 --> 00:24:36,000
Now let's recap what we have learned in this lesson, in this lesson we learned complete about future.
337
00:24:36,000 --> 00:24:42,000
As I said in the beginning of the lesson, it is very useful class that I use very often when I work
338
00:24:42,000 --> 00:24:46,000
with multithreaded, it helps to solve a lot of pain points.
339
00:24:46,000 --> 00:24:52,000
We learned different methods that describes how to execute tasks was complete the future also.
340
00:24:52,000 --> 00:24:56,000
Now you know what a callback is and how to work with callbacks.
341
00:24:56,000 --> 00:25:00,000
With the help of compatible future thought, we managed to build multiple.
342
00:25:00,000 --> 00:25:07,000
Step with this writing process and real examples, you saw how we can combine future objects and work
343
00:25:07,000 --> 00:25:13,000
with them, and at the end of the lesson, I explained how we can manage exceptions with complete double
344
00:25:13,000 --> 00:25:13,000
future time.
345
00:25:14,000 --> 00:25:15,000
That's all for this lesson.
346
00:25:16,000 --> 00:25:17,000
Thanks a lot for your attention.
347
00:25:17,000 --> 00:25:20,000
Have a great day and see you in the next lesson.