gpt4 book ai didi

java - Spring Boot 共享线程

转载 作者:行者123 更新时间:2023-12-01 10:16:24 28 4
gpt4 key购买 nike

我正在开发我的 Spring boot 应用程序收到两个请求:/start 和/stop。我需要为所有客户端请求创建一个共享线程。

当从客户端收到第一个请求“/start”时,应用程序将创建一个由局部变量 T1 共享的线程。

当收到第二个请求“/stop”时,应用程序将设置线程的 boolean 变量“stopped”来停止它,并且线程应该停止。

下一个代码为此共享线程提供安全吗?我应该使用线程对象的局部变量还是需要用另一种方式做吗?

package com.direct.webflow;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@EnableAutoConfiguration
@Controller
public class WebApp {

ThreadDemo T1;

@RequestMapping("/start")
@ResponseBody
String start() {

synchronized(this){
if (T1 == null || T1.stopped) {
T1= new ThreadDemo( "Thread-1");
T1.start();
} else {
return "Already started!";
}
}
return "Thread started!";

}

@RequestMapping("/stop")
@ResponseBody
String end() {
if (T1 == null) {
System.out.println("Not started!");
return "Not started!";
} else if (!T1.stopped) {
T1.stopped=true;
System.out.println("Trying to stop!");
return "Stopped!";
} else {
return "Already stopped!";
}
}

public static void main(String[] args) throws Exception {
SpringApplication.run(WebApp.class, args);
}
}


package com.direct.webflow;

public class ThreadDemo extends Thread {
private Thread t;
private String threadName;
public volatile boolean stopped=false;
ThreadDemo(String name){
threadName = name;
System.out.println("Creating " + threadName );
}

public void run() {
int i=0;
System.out.println("Running " + threadName );
while (!stopped) {
System.out.println("Thread: " +this.isInterrupted()+ threadName + ", " + i++);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.out.println("Thread: STOP!");
break;
}
}
System.out.println("Thread " + threadName + " exiting.");
}

public void start ()
{
stopped=false;
System.out.println("Starting " + threadName );
if (t == null)
{
t = new Thread (this, threadName);
t.start ();
}
}

}

最佳答案

这非常接近。您需要在 Controller end() 方法中添加 synchronized(this) block 。否则,如果同时调用/stop 和/start,您可能会遇到竞争条件。

由于 Spring Controller 是单例,因此您可以像此处所做的那样使用成员变量。

关于java - Spring Boot 共享线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35866695/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com