-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathConcurrentUtils.java
More file actions
153 lines (140 loc) · 3.28 KB
/
Copy pathConcurrentUtils.java
File metadata and controls
153 lines (140 loc) · 3.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
package javasabr.rlib.common.concurrent.util;
import java.util.function.Function;
import javasabr.rlib.common.concurrent.lock.Lockable;
import javasabr.rlib.common.function.ObjectIntFunction;
import javasabr.rlib.logger.api.Logger;
import javasabr.rlib.logger.api.LoggerManager;
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;
/**
* THe utility class with methods to work in concurrent cases.
*
* @author JavaSaBr
*/
@NullMarked
public final class ConcurrentUtils {
private static final Logger LOGGER = LoggerManager.getLogger(ConcurrentUtils.class);
/**
* Notify all threads.
*
* @param object the object
*/
public static void notifyAll(Object object) {
synchronized (object) {
object.notifyAll();
}
}
/**
* Notify all threads from a synchronized block.
*
* @param object the object
*/
public static void notifyAllInSynchronize(Object object) {
object.notifyAll();
}
/**
* Notify all threads and wait.
*
* @param object the object
*/
public static void notifyAndWait(Object object) {
synchronized (object) {
notifyAllInSynchronize(object);
waitInSynchronize(object);
}
}
/**
* Wait.
*
* @param object the object
*/
public static void wait(Object object) {
synchronized (object) {
try {
object.wait();
} catch (final InterruptedException e) {
LOGGER.warning(e);
}
}
}
/**
* Wait.
*
* @param object the object.
* @param time the time in ms.
*/
public static void wait(Object object, long time) {
synchronized (object) {
try {
object.wait(time);
} catch (final InterruptedException e) {
LOGGER.warning(e);
}
}
}
/**
* Wait from a synchronized block.
*
* @param object the object
*/
public static void waitInSynchronize(Object object) {
try {
object.wait();
} catch (final InterruptedException e) {
LOGGER.warning(e);
}
}
/**
* Wait from a synchronized block.
*
* @param object the object.
* @param time the time in ms.
*/
public static void waitInSynchronize(Object object, long time) {
try {
object.wait(time);
} catch (final InterruptedException e) {
LOGGER.warning(e);
}
}
/**
* Apply a function in locked block.
*
* @param <T> the type parameter
* @param <R> the type parameter
* @param sync the synchronizer.
* @param function the function.
* @return the result from the function.
*/
@Nullable
public static <T extends Lockable, R> R get(T sync, Function<T, @Nullable R> function) {
sync.lock();
try {
return function.apply(sync);
} finally {
sync.unlock();
}
}
/**
* Apply a function in locked block.
*
* @param <T> the type parameter
* @param <R> the type parameter
* @param sync the synchronizer.
* @param argument the argument.
* @param function the function.
* @return the result from the function.
*/
@Nullable
public static <T extends Lockable, R> R get(T sync, int argument, ObjectIntFunction<T, R> function) {
sync.lock();
try {
return function.apply(sync, argument);
} finally {
sync.unlock();
}
}
private ConcurrentUtils() {
throw new RuntimeException();
}
}