是的,所以
java无法处理该线程,一个线程只运行直到它终止.
所以:
要摆脱线程,你需要允许线程运行方法结束,然后去掉所有对线程和它构造的Runnable的引用.
你想切换线程整理,一个简单的例子:
class SimpleRunnable implements Runnable {
public volatile boolean run = true; //Volatile for thread safety.
public void run() {
while(run) {
System.out.println("WHOOOO!"); //Boy, will this be annoying
}
}
}
从这个runnable创建一个线程:
SimpleRunnable run = new SimpleRunnable();
Thread thread = new Thread(run);
Thread.start(); //run thread
//Stop thread
run.run=false;
//Thread will be removed when out of scope
您需要在您的情况下为每个用户创建一个Runnable,然后在创建新线程时调用set stop stop变量.
例如,您可以通过userId将每个runnable存储在ConcurrentHashMap中.
ConcurrentHashMap runnablesByUser = new ConcurrentHashMap<>();
public void startNewThreadForUser(String userId){
//Time passes, retrieve and kill old thread:
SimpleRunnable oldRunnable = runnableByUser.get(userId);
if(oldRunnable!=null){
oldRunnable.run=false;
}
SimpleRunnable newRunnableUserOne = new SimpleRunnable();
runnablesByUser.put(userId,newRunnableUserOne);
Thread thread = new Thread(newRunnableUserOne);
thread.start();
}
如果找到,则调用该方法将终止旧线程,通过将其替换为ConcurrentHashMap中的新线程,从范围中释放旧线程,最后启动新线程.
像这样:
public void startThreeThreads(){
startNewThreadForUser("User1");//starts Thread for User1
startNewThreadForUser("User2");//starts Thread for User2
startNewThreadForUser("User1");//Replaces Thread for User1
}
管理运行线程通常在线程池中完成,这在各种方面都很粗糙,但希望它很有用.
如果你愿意,我可以详细说明这个机制.