线程暂停和重启
public class SuspendMain {
private static Map<Thread, Object> lock = new HashMap<>();
private static volatile boolean wait = false;
public static void start() {
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 5; i++) {
Object o = new Object();
executor.execute(() -> {
int d = 0;
while (true) {
if (wait) {
synchronized (o) {
try {
System.out.println(Thread.currentThread().getName() + " start sleep...");
lock.put(Thread.currentThread(), o);
o.wait();
System.out.println(Thread.currentThread().getName() + " restart...");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
d++;
}
});
}
}
public static void suspendTask() {
System.out.println("suspend all thread...");
wait = true;
printThreadInfo();
}
public static void restartTask(){
System.out.println("restart all thread...");
wait = false;
for (Map.Entry<Thread, Object> entry : lock.entrySet()) {
Object value = entry.getValue();
synchronized (value){
value.notify();
}
}
printThreadInfo();
}
private static void printThreadInfo() {
try {
TimeUnit.MICROSECONDS.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (Map.Entry<Thread, Object> entry : lock.entrySet()) {
System.out.println(entry.getKey().getName() + " state: " + entry.getKey().getState());
}
}
public static void main(String[] args) {
start();
while (true){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
suspendTask();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
restartTask();
}
}
}
结果:
suspend all thread...
pool-1-thread-3 start sleep...
pool-1-thread-2 start sleep...
pool-1-thread-1 start sleep...
pool-1-thread-5 start sleep...
pool-1-thread-4 start sleep...
pool-1-thread-5 state: WAITING
pool-1-thread-3 state: WAITING
pool-1-thread-2 state: WAITING
pool-1-thread-4 state: WAITING
pool-1-thread-1 state: WAITING
restart all thread...
pool-1-thread-5 restart...
pool-1-thread-1 restart...
pool-1-thread-2 restart...
pool-1-thread-4 restart...
pool-1-thread-3 restart...
pool-1-thread-5 state: RUNNABLE
pool-1-thread-3 state: RUNNABLE
pool-1-thread-2 state: RUNNABLE
pool-1-thread-4 state: RUNNABLE
pool-1-thread-1 state: RUNNABLE