创建、启动和管理长 运行 线程的最简洁方法是什么?
What is the cleanest way to create, start, and manage long-running threads?
线程在代码中添加了很多文字,使其更难理解和推理。例如看这段代码:
public class ConnectionListener implements Runnable {
private Thread thread;
private boolean running;
public void start() {
if (!running) {
thread = new Thread(this);
thread.start();
}
}
public void stop() {
if (running) {
running = false;
thread.interrupt();
}
}
@Override
public void run() {
running = true;
while (running) {
// Do some crap
}
}
}
这个 class 的全部关注点应该是侦听来自网络的连接请求。但是看看为管理线程添加了多少行代码。有什么办法可以使这段代码更干净吗?!我不想看到 thread = new Thread();
,不是线程变量,也不是任何 stop()
/start()
方法!
我当然知道ExecutorService
是什么...但是如果我想管理一个长运行线程怎么办? long-运行线程是指生命周期与应用程序生命周期一样长的线程。
你有什么好的解决办法吗?一种从 class 中删除线程创建和管理问题而不使 class 扩展另一个 class?
的方法
我使用单线程执行器服务解决了这个问题。我还阅读了 Plain Thread
、ThreadPool
和 SingleThreadExecutor
- .
之间的性能差异
使用单线程执行器允许我启动一个线程并使用其 Future
管理它。参见代码示例:
public void func(String[] args) {
ExecutorService es = Executors.newSingleThreadExecutor();
Future<?> f = es.submit(Some Runnable);
}
感谢@BasilBourque 在评论中为我提供了这个解决方案。
线程在代码中添加了很多文字,使其更难理解和推理。例如看这段代码:
public class ConnectionListener implements Runnable {
private Thread thread;
private boolean running;
public void start() {
if (!running) {
thread = new Thread(this);
thread.start();
}
}
public void stop() {
if (running) {
running = false;
thread.interrupt();
}
}
@Override
public void run() {
running = true;
while (running) {
// Do some crap
}
}
}
这个 class 的全部关注点应该是侦听来自网络的连接请求。但是看看为管理线程添加了多少行代码。有什么办法可以使这段代码更干净吗?!我不想看到 thread = new Thread();
,不是线程变量,也不是任何 stop()
/start()
方法!
我当然知道ExecutorService
是什么...但是如果我想管理一个长运行线程怎么办? long-运行线程是指生命周期与应用程序生命周期一样长的线程。
你有什么好的解决办法吗?一种从 class 中删除线程创建和管理问题而不使 class 扩展另一个 class?
的方法我使用单线程执行器服务解决了这个问题。我还阅读了 Plain Thread
、ThreadPool
和 SingleThreadExecutor
-
使用单线程执行器允许我启动一个线程并使用其 Future
管理它。参见代码示例:
public void func(String[] args) {
ExecutorService es = Executors.newSingleThreadExecutor();
Future<?> f = es.submit(Some Runnable);
}
感谢@BasilBourque 在评论中为我提供了这个解决方案。