У меня есть сервлет Java, который устанавливает переменную сеанса и вызывает класс потока. Я реализую следующее
@WebServlet("/ExportLogs")
public class ExportLogs extends HttpServlet
{
public void doGet(HttpServletRequest request , HttpServletResponse response) throws ServletException,IOException
{
Integer completePercent = new Integer(10);
request.getSession().setAttribute("CompletionStatus" , completePercent);
LogExportingProcess export = new LogExportingProcess();
export.start();
}
}
и у меня есть класс потока, который выполняет длинный процесс следующим образом;
class LogExportingProcess extends Thread
{
public void run()
{
//i want to change the value of the percent complete variable in here.
}
}
Теперь я хочу изменить значение completePercent внутри класса LogExportingProcess. Как я могу этого добиться.




Вам нужно будет передать объект Session при создании LogExportingProcess
class LogExportingProcess extends Thread
{
private HttpSession session;
public LogExportingProcess(HttpSession session) {
this.session = session;
}
public void run()
{
session.setAttribute("CompletionStatus" , completePercent);
}
}
и одно изменение в классе ExportLogs
LogExportingProcess export = new LogExportingProcess(request.getSession());
@Yogesh Badke большое спасибо именно так, как я хотел, чтобы это было
@Serge Ballesta, спасибо за предложение, я сделаю это
Я повторю то, что сказал Серж Бальеста. У меня есть ответ ниже, который сочетает в себе совет Йогеша Бадке с советом Сержа Баллеста с использованием AtomicInteger.
Целое число неизменяемо. AtomicInteger был бы хорошей заменой.
@WebServlet("/ExportLogs")
public class ExportLogs extends HttpServlet
{
public void doGet( final HttpServletRequest request , final HttpServletResponse response ) throws ServletException,IOException
{
final AtomicInteger completePercent = new AtomicInteger(10);
request.getSession().setAttribute("CompletionStatus" , completePercent);
final LogExportingProcess export = new LogExportingProcess( completePercent );
export.start();
}
}
class LogExportingProcess extends Thread
{
final AtomicInteger completePercent;
public LogExportingProcess( final AtomicInteger completePercent )
{
this.completePercent = completePercent;
}
public void run()
{
completePercent.set( 80 ); //80% complete, substitute with real code
}
}
Это предпочтительнее, IMHO, чем хранение ссылки на объект HttpSession, как предлагает Йогеш Бадке, поскольку HttpSession может обычно собираться мусором по истечении времени ожидания, а AtomicInteger увеличивает инкапсуляцию, разделяя только процент, а не всю информацию о сеансе.
Остерегайтесь, сессия могла быть закрыта тем временем, что могло привести к неожиданной установке атрибута в закрытом сеансе. Я бы посоветовал использовать промежуточный объект, хранящийся в сеансе и содержащий все атрибуты, которые могут быть изменены асинхронным потоком.