在状态保持可运行时,如何暂停线程



我正在想一种方法,让线程在不终止的情况下运行几秒钟,保持状态为Runnable,即不更改线程状态,比如Blocked或Waiting。(这是我正在做的一个演示,显示不同时间的线程状态(

一种可能的解决方案是在while循环中旋转它,它什么都不做,或者进行一些CPU密集型计算。这可以正常工作,除非一旦有了相当数量的线程,CPU就会变热。

另一个可能的解决方案是获得URL连接流,但我不希望这依赖于外部连接。

或者,我可以创建自己的输入流,并在read方法中设置sleep,但当我的线程调用它时,它会休眠,将其移动到Timed Waiting状态,这是不好的。

因此,这些解决方案都不实用。

有没有一些现实的方法可以在不旋转CPU的情况下做到这一点?

这是基于user207421上面注释的代码。它按要求工作!

package com.vgrazi.javaconcurrentanimated.study;
import java.io.*;
import java.net.*;
import java.util.concurrent.CompletableFuture;
public class IODelay {
public static void main(String[] args) throws IOException {
new IODelay().call();
}
{
CompletableFuture.runAsync(() -> {
try {
System.out.println("Setting up ServerSocket");
ServerSocket serverSocket=new ServerSocket(1234);
Socket socket=serverSocket.accept();
System.out.println("Request received");
CompletableFuture.runAsync(() -> {
try(OutputStream stream=socket.getOutputStream();) {
System.out.println("ServerSocket received request");
System.out.println("ServerSocket waiting");
Thread.sleep(5000);
stream.write(0);
} catch(IOException | InterruptedException e) {
e.printStackTrace();
}
});
} catch(IOException e) {
e.printStackTrace();
}
});
}
private void call() throws IOException {
Thread currentThread=Thread.currentThread();
CompletableFuture.runAsync(() -> {
for(int i=0; i < 10; i++) {
System.out.println(currentThread.getState());
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
e.printStackTrace();
}
}
});
System.out.println("Setting up client socket");
Socket socket=new Socket("127.0.0.1", 1234);
InputStream inputStream=socket.getInputStream();
System.out.println(System.currentTimeMillis());
inputStream.read();
System.out.println(System.currentTimeMillis());
}

}

最新更新