
28 рд╕реЗ 29 рдЕрдХреНрдЯреВрдмрд░ рддрдХ,
рдЬреЛрдХрд░ 2019 рд╕реЗрдВрдЯ рдкреАрдЯрд░реНрд╕рдмрд░реНрдЧ рдореЗрдВ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдЬрд╛рд╡рд╛ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд░реВрд╕ рдХреА рд╡рд┐рд╢рд╛рд▓рддрд╛ рдореЗрдВ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдФрд░ рд╕рдмрд╕реЗ рдХрдЯреНрдЯрд░ рд╕рдореНрдореЗрд▓рдиред рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рд╛рддрд╡реАрдВ рдмрд╛рд░ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рд░рд┐рдХреЙрд░реНрдб рддреЛрдбрд╝ рджрд┐рдпрд╛, рдЗрд╕ рдмрд╛рд░ рдЗрд╕ рдЖрдпреЛрдЬрди рдиреЗ 2000 рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд┐рдпрд╛ред
рд╕рд╣рдкрд╛рдард┐рдпреЛрдВ рдиреЗ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЬреЛрдХрд░ рдореЗрдВ рд╣рд┐рд╕реНрд╕рд╛ рд▓рд┐рдпрд╛ред рдЗрд╕ рд╡рд░реНрд╖, рд╣рдорд╛рд░реЗ рдмреВрде рдкрд░, рдХреЛрдИ рднреА рдкреНрд░рдореБрдЦ OK.RU рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рд╕реЗ рдкреНрд░рд╕рд┐рджреНрдз "рдмрд┐рдирд╛ рд╕реЛрдЪреЗ рд╕рдордЭреЗ" рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╕рдореНрдореЗрд▓рди рдХреЗ рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдиреЗ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рд╕рд╣реА рдЬрд╡рд╛рдм рджрд┐рдП рдФрд░ рдкреБрд░рд╕реНрдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдПред
рдирд┐рд╖реНрдкрдХреНрд╖рддрд╛ рдореЗрдВ, рдореБрдЭреЗ рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдордиреЗ рдЬреЛ рдХрд╛рдо рд╕реМрдВрдкреЗ, рдЙрдирдореЗрдВ рд╕реЗ резрежрежреж рдкрд░реНрдЪреЗ рдореЗрдВ рд╕реЗ резрежреж рд╕реЗ рдХрдо рд╡рд╛рдкрд╕ рдХрд┐рдП рдЧрдПред рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдерд╛, рдЬрд┐рд╕рдиреЗ рел рдореЗрдВ рд╕реЗ рек.рел рдЕрдВрдХ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдПред
рд╣рдо рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдЙрдирдХреЗ рд╕рдорд╛рдзрд╛рди рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЖрдк рдЕрдкрдиреА рддрд╛рдХрдд рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХреЗрдВред
1. рд╡реАрд░ рд╢рддреНрд░реБ
рдПрдХ рдЕрд▓реНрдкрдЬреНрдЮрд╛рдд рдЦреЗрд▓ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдХреЛрдб рдХрд╛ рдкрддрд╛ рдЪрд▓рд╛ред
Group.of
рдХрд╛ рдмреБрд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреНрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдП?
enum Group { Few(1, 4), Several(5, 9), Pack(10, 19), Lots(20, 49), Swarm(50, Integer.MAX_VALUE); Group(int min, int max) { ... } public static Group of(int count) { for (Group group : Group.values()) { if (count >= group.min && count <= group.max) { return group; } } throw new IllegalArgumentException(); } }
рдирд┐рд░реНрдгрдпрдпрджрд┐ рдЖрдк рдХреЛрдбрд┐рдВрдЧ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдПрдХ рдЙрджреНрджреЗрд╢реНрдп рджреЛрд╖ рд╣реИ - рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛ред рдпрджреНрдпрдкрд┐ рд░реИрдЦрд┐рдХ рдЦреЛрдЬ рдЕрдХреНрд╕рд░ рдПрдХ рдЕрдбрд╝рдЪрди рдмрди рдЬрд╛рддреА рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдмрд┐рдВрджреБ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдПрдирдо рдореЗрдВ рдХреЗрд╡рд▓ рдкрд╛рдВрдЪ рддрддреНрд╡ рд╣реИрдВред рдФрд░ рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдирдХрд╛рд░рд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ,
Group.values()
рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдореЗрдореЛрд░реА рдХрд╛ рдЕрддреНрдпрдзрд┐рдХ рдЖрд╡рдВрдЯрди рд╣реИред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рд░ рдмрд╛рд░ рдПрдирдо рдХрд╛
values()
рд╡рд┐рдзрд┐ рд╕рд░рдгреА рдХреА рдПрдХ рдирдИ рдкреНрд░рддрд┐ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ рд╣реЙрдЯрд╕реНрдкреЙрдЯ рдЕрднреА рддрдХ рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИред рдПрдХ рд╕рд░рд▓ рдЙрдкрд╛рдп рдпрд╣ рд╣реИ рдХрд┐
values()
рдХреА рдЕрдкрдиреА рдкреНрд░рддрд┐
values()
рд╕рд░рдгреА рдФрд░ рдЙрд╕ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░реЗрдВ:
private static final Group[] ALL_GROUPS = Group.values(); public static Group of(int count) { for (Group group : ALL_GROUPS) { .... }
2. рд╕рдкрдиреЗ
рдЬрд╛рд╡рд╛ 13 рдкрд╣рд▓реЗ рд╣реА рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ, рдФрд░ рдирд┐рдХреЛрд▓рд╛рдИ рдЕрднреА рднреА рдХреЗрд╡рд▓ рдзрд╛рд░рд╛рдУрдВ рдХреЛ рд╕рдордЭрддреА рд╣реИред рдЙрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ рдЬреЛ рдЕрдзрд┐рдХрддрдо рдФрд░ рдиреНрдпреВрдирддрдо рд╕реНрдЯреНрд░реАрдо рддрддреНрд╡реЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред
int getDiameter(Stream<Integer> stream) { int min = stream.min(Integer::compare).get(); int max = stream.max(Integer::compare).get(); return max - min; }
рдирд┐рд░реНрдгрдпрдЬрд╛рд╡рд╛ рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдмрд╛рд░ рд╣реЛрддреА рд╣реИрдВ: рджреВрд╕рд░реЗ рдЯрд░реНрдорд┐рдирд▓ рдСрдкрд░реЗрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ,
max
) рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛:
java.lang.IllegalStateException: stream has already been operated upon or closed
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛,
min
рдФрд░
max
рд░рд┐рдЯрд░реНрди
Optional
, рдЬрд┐рд╕ рдкрд░
get()
рдСрдкрд░реЗрд╢рди рдПрдХ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП
NoSuchElementException
рдлреЗрдВрдХ рджреЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдХреЙрд▓
get()
рд╕реЗ рдкрд╣рд▓реЗ
get()
рдпрд╛ рдЕрдиреНрдп
Optional
рддрд░реАрдХреЛрдВ:
orElse ,
orElseThrow , рдЗрддреНрдпрд╛рджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
get()
рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реИред
рдЕрдВрдд рдореЗрдВ, рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рджреЛ
int
рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдЕрдм
int
рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд╕рд╛рд╡рдзрд╛рди рдбреЗрд╡рд▓рдкрд░ рд╕реЗ рдмрдЪ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдпрд╣ рд╡рд╛рдкрд╕реА рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ
long
рдмрджрд▓рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛрдЧрд╛ред
3. рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдлрд░
ByteBuffer
рдЬрд╛рд╡рд╛ рддреБрд▓реНрдпрдХрд╛рд▓рди рдЖрджрд┐рдо
put
рдФрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп
ByteBuffer
рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдзрд╛рдЧрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ?
final ByteBuffer buf = ByteBuffer.allocate(SIZE); int get(int offset) { return buf.get(offset); } void put(int offset, int value) { buf.putInt(offset, value); }
рд╕рдмрд╕реЗ рдХреБрд╢рд▓ рд╡рд┐рдХрд▓реНрдк рдЪреБрдиреЗрдВ рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрдИ рдзрд╛рдЧреЗ рд╣реИрдВ, рдФрд░ рдкреБрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рд░ рд░рди рдорд┐рд▓рддреЗ рд╣реИрдВред
- рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝
- ReentrantLock
- ReentrantReadWriteLock
- StampedLock
- рд╕рд┐рдХрдВрджрд░рд╛
- рдЬрд╛рд╡рд╛ рдореЗрдВ рдкрдврд╝рдирд╛ рдФрд░ рд▓рд┐рдЦрдирд╛ рд╣рдореЗрд╢рд╛ рдкрд░рдорд╛рдгреБ рд╣реЛрддрд╛ рд╣реИ
рдирд┐рд░реНрдгрдпReentrantReadWriteLock
рдкрд╛рдардХ рдФрд░ рд▓реЗрдЦрдХ
ReentrantReadWriteLock
рд▓рд┐рдП рднреАрдЦ рдорд╛рдБрдЧрддрд╛
ReentrantReadWriteLock
, рдФрд░ рдЕрдХреНрд╕рд░ рдпрд╣ рдПрдХ рдкреНрд░рднрд╛рд╡реА рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЧреЗрдЯ рдФрд░ рдкреБрдЯ рдСрдкрд░реЗрд╢рди рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИрдВ - рд╕рдВрднрд╛рд╡рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдкреБрдЯ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ рдЫреЛрдЯреЗ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреБрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдкреБрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдХрдо рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рддреЛ, рдЖрдк
рдЖрд╢рд╛рд╡рд╛рджреА рд▓реЙрдХрд┐рдВрдЧ рддрдВрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ
рд╕реНрдЯреИрдореНрдкрдбреЙрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
StampedLock
рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реЛрдЧрд╛, рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдПрдХ рдЖрд╢рд╛рд╡рд╛рджреА рдлрд╛рд╕реНрдЯ рдкрде рд╕рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд╛рдЭрд╛ рдЪрд░ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐
StampedLock
рд╕рдмрд╕реЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ
рдХреИрд╕ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддрд╛ рд╣реИред
4. рдЙрдкрд╣рд╛рд░
рдЗрд▓реНрдпрд╛ рд╕реЛрд╢рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЙрдкрд╣рд╛рд░реЛрдВ рдХрд╛ рдПрдХ рд╢реЛрдХреЗрд╕ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реА рд╣реИред рдЙрд╕реЗ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП
add
рдореЗрдердб рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВ рдЬреЛ рдирд╡реАрдирддрдо рдЙрдкрд╣рд╛рд░реЛрдВ рдХреЗ рдПрди рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИред рдПрдХ рдЙрдкрд╣рд╛рд░ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЕрдЧрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ, рдпрд╛ рдпрджрд┐ рдпрд╣ рдмрд╛рдХреА рдПрди рд╕реЗ рдкреБрд░рд╛рдирд╛ рд╣реИред
interface Present { long getId(); Date getCreated(); } void add(Present p) {
рдирд┐рд░реНрдгрдпTreeSet
рдпрд╛
PriorityQueue
TreeSet
рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрд╣рд╛рд░реЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдУ (рд▓реЙрдЧ рдПрди) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдмрд╕реЗ рдкреБрд░рд╛рдиреЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред рд╕рднреА рдЪрд╛рд▓ рдХреЗрд╡рд▓ рддреБрд▓рдирд┐рддреНрд░ рдореЗрдВ рд╣реИ: рдпрд╣ рдХреЗрд╡рд▓
getCreated()
рд╕рд╛рде рдЙрдкрд╣рд╛рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдирд┐рд░реНрдорд╛рдг рдХреА рддрд╛рд░реАрдЦ рдЕрджреНрд╡рд┐рддреАрдп рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ
getCreated()
, рдлрд┐рд░
getCreated()
рджреНрд╡рд╛рд░рд╛ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рддреБрд▓рдирд┐рддреНрд░ рддрддреНрд╡реЛрдВ рдХреА рдЕрджреНрд╡рд┐рддреАрдпрддрд╛ рдФрд░ рддрд┐рдерд┐ рджреНрд╡рд╛рд░рд╛ рдЖрджреЗрд╢ рджреЛрдиреЛрдВ рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВрдЧреЗред
TreeSet<Present> tree = new TreeSet<>( Comparator.comparing(Present::getCreated) .thenComparing(Present::getId));
рдпрд╣ рдПрдХ рдЫреЛрдЯреА рд╕реА рдмрд╛рдд рдмрдиреА рд╣реБрдИ рд╣реИ: рдПрдХ рдЙрдкрд╣рд╛рд░ рдЬреЛрдбрд╝рддреЗ рд╕рдордп, рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдЖрдХрд╛рд░ рдПрди рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдкрд╣рд▓реЗ, рд╕рдмрд╕реЗ рдкреБрд░рд╛рдиреЗ, рддрддреНрд╡ рдХреЛ рд╣рдЯрд╛ рджреЗрдВред
void add(Present p) { if (tree.add(p) && tree.size() > N) { tree.pollFirst(); } }
5. рдЖрдк рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ
рдЬреВрд▓рд┐рдпрд╛ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЕрдВрдд рдХрд╛ рдХрднреА рдЗрдВрддрдЬрд╛рд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░реЗрдЧреА?
var executor = Executors.newFixedThreadPool(4); for (File f : File.listRoots()) { executor.submit(() -> f.delete()); } executor.awaitTermination(2, TimeUnit.HOURS);