使用Javaweb实现在线调查问卷系统

简介: 使用Javaweb实现在线调查问卷系统

项目编号:BS-PT-014


开发技术: jsp/servlet   前端技术:jquery+layui

开发工具:IDEA/Eclipse

数据库:MYSQL5


功能介绍:


    在线调查问卷系统:实现了调查问卷管理,调查项管理,问卷审核管理,问卷统计管理,用户管理,友情链接管理等功能。问卷支持单选,多选,问答多种调查题型。支持公开问卷和私有问卷等类型。功能完整,运行无误。


部分功能截图:


  首页:

image.png

调查问卷填写:

20200723082104659.png

问卷列表展示:

image.png

后台管理界面:

image.png

网站系统配置:

image.png

问卷管理:

image.png

友情连接管理:

image.png

问卷添加:

20200723082538644.png

问卷审核:问卷添加后,审核通过才能使用

image.png

问卷统计:统计每个调查问卷的情况

image.png

用户管理:

image.png

友情连接管理:

image.png

以上就是网络在线调查问卷系统的基本功能,可以根据需求进行调整。基于JSP实现的在线调查问卷系统。

package com.ec.survey.ctrl;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.ec.survey.dao.AdminDAO;
import com.ec.survey.dao.DAOFactory;
import com.ec.survey.dao.QuestionDAO;
import com.ec.survey.dao.SurveyDAO;
import com.ec.survey.dto.Admin;
public class AdminManage extends HttpServlet {
  /**
   * The doGet method of the servlet. <br>
   *
   * This method is called when a form has its tag value method equals to get.
   * 
   * @param request the request send by the client to the server
   * @param response the response send by the server to the client
   * @throws ServletException if an error occurred
   * @throws IOException if an error occurred
   */
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
  doPost(request, response);
  }
  /**
   * The doPost method of the servlet. <br>
   *
   * This method is called when a form has its tag value method equals to post.
   * 
   * @param request the request send by the client to the server
   * @param response the response send by the server to the client
   * @throws ServletException if an error occurred
   * @throws IOException if an error occurred
   */
  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    String mutex1="";
    //String mutex2="";
    String op=request.getParameter("op");
    if("AddAdmin".equals(op)){
      String username=request.getParameter("username");
      String pwd=request.getParameter("pwd");
      AdminDAO dao=DAOFactory.getAdminDAO();
      Admin admin=new Admin();
      admin.setA_user(username);
      admin.setA_pass(pwd);
      boolean ret1=dao.addAdmin(admin);
      if(ret1)
        response.sendRedirect("../admin/AdminList.jsp");
      else
        response.sendRedirect("../admin/OpResult.jsp?op=default&ret=false&words="+URLEncoder.encode("增加管理员出错!请联系管理员", "UTF-8") );
    }
    else if("DelAdmin".equals(op)){
      Long aid=Long.valueOf(request.getParameter("aid"));
      AdminDAO dao=DAOFactory.getAdminDAO();
      boolean ret1=dao.delAdmin(aid);
      if(ret1)
        response.sendRedirect("../admin/AdminList.jsp");
      else
        response.sendRedirect("../admin/OpResult.jsp?op=default&ret=false&words="+URLEncoder.encode("删除管理员出错!请联系管理员", "UTF-8"));
    }else if("EditAdmin".equals(op)){
      Long aid=Long.valueOf(request.getParameter("aid"));
      String oldpwd=request.getParameter("oldpwd");
      String pwd=request.getParameter("pwd");
      String username=request.getParameter("username");
      AdminDAO dao=DAOFactory.getAdminDAO();
      if(dao.checkPwd(username, oldpwd)!=true){
        response.sendRedirect("../admin/OpResult.jsp?op=default&ret=false&words="+URLEncoder.encode("旧密码错误", "UTF-8"));
        return;
      }
      synchronized(mutex1){
      Admin admin=dao.findAdmin(aid);
      admin.setA_user(username);
      admin.setA_pass(pwd);
      boolean ret1=dao.updateAdmin(admin);
      if(ret1)
        response.sendRedirect("../admin/AdminList.jsp");
      else
        response.sendRedirect("../admin/OpResult.jsp?op=default&ret=false&words="+URLEncoder.encode("编辑管理员出错!请联系管理员", "UTF-8"));
      }
    }
  }
}

package com.ec.survey.ctrl;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.ec.survey.dao.ConfigDAO;
import com.ec.survey.dao.DAOFactory;
import com.ec.survey.dto.Config;
public class ConfigManage extends HttpServlet {
  /**
   * Constructor of the object.
   */
  public ConfigManage() {
    super();
  }
  /**
   * Destruction of the servlet. <br>
   */
  public void destroy() {
    super.destroy(); // Just puts "destroy" string in log
    // Put your code here
  }
  /**
   * The doGet method of the servlet. <br>
   *
   * This method is called when a form has its tag value method equals to get.
   * 
   * @param request the request send by the client to the server
   * @param response the response send by the server to the client
   * @throws ServletException if an error occurred
   * @throws IOException if an error occurred
   */
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    doPost(request,response);
  }
  /**
   * The doPost method of the servlet. <br>
   *
   * This method is called when a form has its tag value method equals to post.
   * 
   * @param request the request send by the client to the server
   * @param response the response send by the server to the client
   * @throws ServletException if an error occurred
   * @throws IOException if an error occurred
   */
  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    ConfigDAO configdao=DAOFactory.getConfigDAO();
    Config config=new Config();
    config.setCSiteName(request.getParameter("siteName"));
    config.setCSiteUrl(request.getParameter("siteURL"));
    config.setCIsOpen(Boolean.valueOf(request.getParameter("siteOpen")));
    config.setCCloseWord(request.getParameter("closeWord"));
    config.setCopyright(request.getParameter("copyright"));
    boolean ret=configdao.updateConfig(config);
    if (ret==true)
      response.sendRedirect("../admin/OpResult.jsp?op=SysConfig&ret=true");
    else
      response.sendRedirect("../admin/OpResult.jsp?op=SysConfig&ret=false");
  }
  /**
   * Initialization of the servlet. <br>
   *
   * @throws ServletException if an error occurs
   */
  public void init() throws ServletException {
    // Put your code here
  }
}
package com.ec.survey.ctrl;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.ec.survey.dao.DAOFactory;
import com.ec.survey.dao.QuestionDAO;
import com.ec.survey.dto.Question;
public class QuestionManage extends HttpServlet {
  /**
   * The doGet method of the servlet. <br>
   *
   * This method is called when a form has its tag value method equals to get.
   * 
   * @param request the request send by the client to the server
   * @param response the response send by the server to the client
   * @throws ServletException if an error occurred
   * @throws IOException if an error occurred
   */
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
  doPost(request,response);
  }
  /**
   * The doPost method of the servlet. <br>
   *
   * This method is called when a form has its tag value method equals to post.
   * 
   * @param request the request send by the client to the server
   * @param response the response send by the server to the client
   * @throws ServletException if an error occurred
   * @throws IOException if an error occurred
   */
  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
     String mutex = ""; 
     String mutex1 = ""; 
     String mutex2 = ""; 
    String op=request.getParameter("op");
    if("AddQuestion".equals(op)){
      String sid=request.getParameter("sid");
      String type=request.getParameter("type");
      String qhead=request.getParameter("qHead");
      String qbody=request.getParameter("qBody"); 
      String qresult=request.getParameter("qResult");
      String qimg=request.getParameter("qImg");
      Question question=new Question();
      question.setSurvey(Long.valueOf(sid));
      question.setQType(Long.valueOf(type));
      question.setQHead(qhead);
      question.setQBody(qbody);
      question.setQResult(qresult);
      question.setQImg(qimg);
      question.setQOrder(0L);
      String [] qbodys=qbody.split("&\\$\\$&");
      String spliter="";
      for(int i=1;i<qbodys.length;i++)
        if(i==qbodys.length-1)
          spliter=spliter+"null&null";
        else
          spliter=spliter+"null&";
      question.setQJdtz(spliter);
      QuestionDAO dao=DAOFactory.getQuestionDAO();
      boolean ret=dao.addQuestion(question);
      if(ret==true)
        response.sendRedirect("../admin/OpResult.jsp?op=Question&ret=true&sid="+sid);
      else{
        response.sendRedirect("../admin/OpResult.jsp?op=Question&ret=false");
      }
    }else if("DelQuestion".equals(op)){
      String sid=request.getParameter("sid");
      String qid=request.getParameter("qid");
      QuestionDAO dao=DAOFactory.getQuestionDAO();
      boolean ret=dao.delQuestion(Long.valueOf(qid));
      if(ret==true)
        response.sendRedirect("../admin/QuestionAdmin.jsp?sid="+sid);
      else
        response.sendRedirect("../admin/OpResult.jsp?op=Question&ret=false");
    }else if("EditQuestion".equals(op)){
      String sid=request.getParameter("sid");
      String qid=request.getParameter("qid");
      //System.out.println(qid);
      String type=request.getParameter("type");
      String qhead=request.getParameter("qHead");
      String qbody=request.getParameter("qBody"); 
      String qimg=request.getParameter("qImg");
      QuestionDAO dao=DAOFactory.getQuestionDAO();
      synchronized(mutex){
      Question question=dao.findQuestion(Long.valueOf(qid));
      //System.out.println(question==null);
      question.setQType(Long.valueOf(type));
      question.setQHead(qhead);
      question.setQBody(qbody);
      question.setQImg(qimg);
      String [] qbodys=qbody.split("&\\$\\$&");
      String spliter="";
      for(int i=1;i<qbodys.length;i++)
        if(i==qbodys.length-1)
          spliter=spliter+"null&null";
        else
          spliter=spliter+"null&";
      question.setQJdtz(spliter);
      question.setQOrder(0L);
      boolean ret=dao.updateQuestion(question);
      if(ret==true)
        response.sendRedirect("../admin/OpResult.jsp?op=Question&ret=true&sid="+sid);
      else
        response.sendRedirect("../admin/OpResult.jsp?op=Question&ret=false");
      }
    }else if("setJD".equals(op)){
      String sid=request.getParameter("sid");
      String qid=request.getParameter("qid");
      int jd_count=Integer.parseInt(request.getParameter("jd_count"));
      List<String> list=new ArrayList<String>();
      for(int j=0;j<jd_count;j++){
        String checked=request.getParameter("check_jd"+j);
          list.add(checked);
      }
      QuestionDAO dao=DAOFactory.getQuestionDAO();
      synchronized(mutex1){
      Question question=dao.findQuestion(Long.valueOf(qid));
      String [] jdtz=question.getQJdtz().split("&");
      for(int j=0;j<jdtz.length;j++){
        if("on".equals(list.get(j)))
          jdtz[j]="over";
      }
      String newJdtz="";
      for(int j=0;j<jdtz.length;j++){
        if(j==jdtz.length-1)
          newJdtz=newJdtz+jdtz[j];
        else
          newJdtz=newJdtz+jdtz[j]+"&";
      }
      question.setQJdtz(newJdtz);
      boolean ret=dao.updateQuestion(question);
      if(ret==true)
        response.sendRedirect("../admin/OpResult.jsp?op=Question&ret=true&sid="+sid);
      else
        response.sendRedirect("../admin/OpResult.jsp?op=Question&ret=false");
      }
    }else if("setTZ".equals(op)){
      String sid=request.getParameter("sid");
      String qid=request.getParameter("qid");
      int jd_count=Integer.parseInt(request.getParameter("tz_count"));
      List<String> list=new ArrayList<String>();
      for(int j=0;j<jd_count;j++){
        String checked=request.getParameter("check_tz"+j);
          list.add(checked);
      }
      QuestionDAO dao=DAOFactory.getQuestionDAO();
      synchronized(mutex2){
      Question question=dao.findQuestion(Long.valueOf(qid));
      //set value of jdtz for every choice
      String [] jdtz=question.getQJdtz().split("&");
      for(int j=0;j<jdtz.length;j++){
        //System.out.println(list.get(j));
        if("on".equals(list.get(j))||list.get(j)==null){
          jdtz[j]="null";
        }else
          jdtz[j]=list.get(j);
      }
      //start concat the jdtz field with &.
      String newJdtz="";
      for(int j=0;j<jdtz.length;j++){
        if(j==jdtz.length-1)
          newJdtz=newJdtz+jdtz[j];
        else
          newJdtz=newJdtz+jdtz[j]+"&";
      }
      question.setQJdtz(newJdtz);
      boolean ret=dao.updateQuestion(question);
      if(ret==true)
        response.sendRedirect("../admin/OpResult.jsp?op=Question&ret=true&sid="+sid);
      else
        response.sendRedirect("../admin/OpResult.jsp?op=Question&ret=false");
    }
    }
  }
}
package com.ec.survey.ctrl;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.ec.survey.dao.AnswersheetDAO;
import com.ec.survey.dao.DAOFactory;
import com.ec.survey.dao.QuestionDAO;
import com.ec.survey.dao.SurveyDAO;
import com.ec.survey.dao.TextDAO;
import com.ec.survey.dto.Survey;
public class SurveyManage extends HttpServlet {
  /**
   * 
   */
  private static final long serialVersionUID = -1737458302140188798L;
  /**
   * Constructor of the object.
   */
  public SurveyManage() {
    super();
  }
  /**
   * Destruction of the servlet. <br>
   */
  public void destroy() {
    super.destroy(); // Just puts "destroy" string in log
    // Put your code here
  }
  /**
   * The doGet method of the servlet. <br>
   *
   * This method is called when a form has its tag value method equals to get.
   * 
   * @param request the request send by the client to the server
   * @param response the response send by the server to the client
   * @throws ServletException if an error occurred
   * @throws IOException if an error occurred
   */
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    PrintWriter out=response.getWriter();
    String mutex1="";
    String mutex2="";
    if("AddSurvey".equals(request.getParameter("op"))){
      SurveyDAO surveydao=DAOFactory.getSurveyDAO(); 
      Survey survey=new Survey();
      survey.setSName(request.getParameter("Survey_name"));
      survey.setSAuthor(request.getParameter("Survey_author"));
      survey.setSDesc(request.getParameter("Survey_description"));
      survey.setSCreateDate(new Date());
      SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
      try {
        survey.setSExpireDate(sdf.parse(request.getParameter("Survey_ExpireDate")));
      } catch (ParseException e) {
         out.println("wrong DATE format.please check it!");
      }
      survey.setTemplet(0L);
      survey.setSIpRepeat(Boolean.valueOf(request.getParameter("Survey_ipRepeat")));
      survey.setSIsOpen(Boolean.valueOf(request.getParameter("Survey_isOpen")));
      if(request.getParameter("Survey_isImg")!=null)
        survey.setSImg(request.getParameter("imgfilepath"));
      if(request.getParameter("Survey_isPassword")!=null)
        survey.setSPassword(request.getParameter("Survey_Password1"));
      if(request.getParameter("Survry_IPLimit")!=null){
        //survey.setSIpLimitType(request.getParameter("Survey_ipLimitKinds"));
        survey.setSIpRange(request.getParameter("Survey_ipRange"));
      }
      survey.setSHits(0L);
      survey.setSIsAudited(false);
      survey.setSUsehits(0L);
      boolean ret=surveydao.addSurvey(survey);
      //System.out.println(ret);
      if(ret==true)
        response.sendRedirect("../admin/OpResult.jsp?op=SurveyAdd&ret=true");
      else
        response.sendRedirect("../admin/OpResult.jsp?op=SurveyAdd&ret=false");
    }
    else if("SurveyAudi".equals(request.getParameter("op"))){
      Boolean audit=Boolean.valueOf(request.getParameter("audit"));
      SurveyDAO surveydao=DAOFactory.getSurveyDAO();
      synchronized(mutex1){
      Survey  survey=surveydao.findSurvey(Long.valueOf(request.getParameter("sid")));
      if(audit==true)
        survey.setSIsAudited(true);
      else
        survey.setSIsAudited(false);
      boolean ret=surveydao.updateSurvey(survey);
      if(ret==true)
        response.sendRedirect("../admin/SurveyAudi.jsp");
      else
        response.sendRedirect("../admin/OpResult.jsp?op=SurveyAudi&ret=false");
      }
    }else if("EditSurvey".equals(request.getParameter("op"))){
      SurveyDAO surveydao=DAOFactory.getSurveyDAO(); 
      String sid=request.getParameter("Survey_id");
      synchronized(mutex2){
      Survey survey=surveydao.findSurvey(Long.valueOf(request.getParameter("Survey_id")));
      survey.setSName(request.getParameter("Survey_name"));
      survey.setSAuthor(request.getParameter("Survey_author"));
      survey.setSDesc(request.getParameter("Survey_description"));
      SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
      try {
        survey.setSExpireDate(sdf.parse(request.getParameter("Survey_ExpireDate")));
      } catch (ParseException e) {
         out.println("wrong DATE format.please check it!");
      }
      survey.setTemplet(0L);//?????幦??
      survey.setSIpRepeat(Boolean.valueOf(request.getParameter("Survey_ipRepeat")));
      survey.setSIsOpen(Boolean.valueOf(request.getParameter("Survey_isOpen")));
      if(request.getParameter("Survey_isImg")!=null){
        if(request.getParameter("imgfilepath")!=null)
        survey.setSImg(request.getParameter("imgfilepath"));
      }else
        survey.setSImg(null);
      //System.out.println(request.getParameter("Survey_isPassword"));
      if(request.getParameter("Survey_isPassword")!=null){
        survey.setSPassword(request.getParameter("Survey_isPassword"));
      }else
        survey.setSPassword(null);
      if(request.getParameter("Survry_IPLimit")!=null){
        //survey.setSIpLimitType(request.getParameter("Survey_ipLimitKinds"));
        survey.setSIpRange(request.getParameter("Survey_ipRange"));
        //System.out.print(request.getParameter("Survey_ipRange"));
      }else
      {
        survey.setSIpLimitType(null);
        survey.setSIpRange(null);
      }
      boolean ret=surveydao.updateSurvey(survey);
      //System.out.println(ret);
      if(ret==true)
        response.sendRedirect("../admin/SurveyEdit.jsp?sid="+sid+"&words="+URLEncoder.encode("操作成功!", "UTF-8"));
      else
        response.sendRedirect("../admin/OpResult.jsp?op=SurveyEdit&ret=false");
      }
    }else if("DelSurvey".equals(request.getParameter("op"))){
      Long surveyId=Long.valueOf(request.getParameter("sid"));
      SurveyDAO surveydao=DAOFactory.getSurveyDAO(); 
      boolean ret1=surveydao.delSurvey(surveyId);
      QuestionDAO questiondao=DAOFactory.getQuestionDAO();
      if(ret1==true)
        ret1=questiondao.delQuestions(surveyId);
      if(ret1==true){
        TextDAO tdao=DAOFactory.getTextDAO();
        ret1=tdao.delText(surveyId);
      }
      if(ret1==true){
        AnswersheetDAO adao=DAOFactory.getAnswersheetDAO();
        ret1=adao.delAnswersheets(surveyId);
      }
      if(ret1==true)
        response.sendRedirect("../admin/SurveyAdmin.jsp");
      else
        response.sendRedirect("../admin/OpResult.jsp?op=SurveyDel&ret=false");
    }
  }
  /**
   * The doPost method of the servlet. <br>
   *
   * This method is called when a form has its tag value method equals to post.
   * 
   * @param request the request send by the client to the server
   * @param response the response send by the server to the client
   * @throws ServletException if an error occurred
   * @throws IOException if an error occurred
   */
  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    doGet(request,response);
  }
  /**
   * Initialization of the servlet. <br>
   *
   * @throws ServletException if an error occurs
   */
  public void init() throws ServletException {
    // Put your code here
  }
}
相关文章
|
2月前
|
监控 Java API
如何使用Java语言快速开发一套智慧工地系统
使用Java开发智慧工地系统,采用Spring Cloud微服务架构和前后端分离设计,结合MySQL、MongoDB数据库及RESTful API,集成人脸识别、视频监控、设备与环境监测等功能模块,运用Spark/Flink处理大数据,ECharts/AntV G2实现数据可视化,确保系统安全与性能,采用敏捷开发模式,提供详尽文档与用户培训,支持云部署与容器化管理,快速构建高效、灵活的智慧工地解决方案。
|
2月前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
2月前
|
运维 自然语言处理 供应链
Java云HIS医院管理系统源码 病案管理、医保业务、门诊、住院、电子病历编辑器
通过门诊的申请,或者直接住院登记,通过”护士工作站“分配患者,完成后,进入医生患者列表,医生对应开具”长期医嘱“和”临时医嘱“,并在电子病历中,记录病情。病人出院时,停止长期医嘱,开具出院医嘱。进入出院审核,审核医嘱与住院通过后,病人结清缴费,完成出院。
124 4
|
2月前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
51 1
|
2月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
3月前
|
移动开发 前端开发 JavaScript
java家政系统成品源码的关键特点和技术应用
家政系统成品源码是已开发完成的家政服务管理软件,支持用户注册、登录、管理个人资料,家政人员信息管理,服务项目分类,订单与预约管理,支付集成,评价与反馈,地图定位等功能。适用于各种规模的家政服务公司,采用uniapp、SpringBoot、MySQL等技术栈,确保高效管理和优质用户体验。
|
3月前
|
XML JSON 监控
告别简陋:Java日志系统的最佳实践
【10月更文挑战第19天】 在Java开发中,`System.out.println()` 是最基本的输出方法,但它在实际项目中往往被认为是不专业和不足够的。本文将探讨为什么在现代Java应用中应该避免使用 `System.out.println()`,并介绍几种更先进的日志解决方案。
77 1
|
2天前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
33 17
|
13天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
15天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。