diff --git a/core-java/threaddump/pom.xml b/core-java/threaddump/pom.xml
new file mode 100644
index 0000000..4f7830d
--- /dev/null
+++ b/core-java/threaddump/pom.xml
@@ -0,0 +1,47 @@
+
+ 4.0.0
+ io.pratik.server
+ ServerApp
+ jar
+ 1.0-SNAPSHOT
+ ServerApp
+ http://maven.apache.org
+
+ 11
+ 11
+
+
+
+ junit
+ junit
+ 3.8.1
+ test
+
+
+
+
+
+ maven-compiler-plugin
+ 3.8.1
+
+ 11
+ 11
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ 2.4
+
+
+
+ io.pratik.server.App
+
+
+
+
+
+
+
diff --git a/core-java/threaddump/src/main/java/io/pratik/server/App.java b/core-java/threaddump/src/main/java/io/pratik/server/App.java
new file mode 100644
index 0000000..6e67f06
--- /dev/null
+++ b/core-java/threaddump/src/main/java/io/pratik/server/App.java
@@ -0,0 +1,21 @@
+package io.pratik.server;
+
+import java.net.ServerSocket;
+import java.util.logging.Logger;
+
+/**
+ * @author pratikdas
+ *
+ */
+public class App {
+ private static final Logger logger = Logger.getLogger(App.class.getName());
+
+ public static void main(String[] args) throws Exception {
+ ServerSocket ssock = new ServerSocket(8080);
+ logger.info("Server Started. Listening on port 8080");
+
+ while (true) {
+ new RequestProcessor(ssock).handleClientRequest();;
+ }
+ }
+}
diff --git a/core-java/threaddump/src/main/java/io/pratik/server/RequestProcessor.java b/core-java/threaddump/src/main/java/io/pratik/server/RequestProcessor.java
new file mode 100644
index 0000000..72145af
--- /dev/null
+++ b/core-java/threaddump/src/main/java/io/pratik/server/RequestProcessor.java
@@ -0,0 +1,80 @@
+/**
+ *
+ */
+package io.pratik.server;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Logger;
+
+/**
+ * @author pratikdas
+ *
+ */
+public class RequestProcessor {
+ private static final Logger logger = Logger.getLogger(RequestProcessor.class.getName());
+
+ private ServerSocket serverSocket = null;
+
+ public RequestProcessor(final ServerSocket ssock) {
+ super();
+ this.serverSocket = ssock;
+ }
+
+
+ public void handleClientRequest() throws IOException {
+ try (Socket client = serverSocket.accept()) {
+ logger.info("Processing request from client " + client.getInetAddress().getHostAddress());
+ BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
+
+ StringBuilder requestBuilder = new StringBuilder();
+ String line;
+ while (!(line = br.readLine()).isBlank()) {
+ requestBuilder.append(line + "\r\n");
+ }
+
+ String request = requestBuilder.toString();
+ String[] requestsLines = request.split("\r\n");
+ String[] requestLine = requestsLines[0].split(" ");
+ String method = requestLine[0];
+ String path = requestLine[1];
+ String version = requestLine[2];
+ String host = requestsLines[1].split(" ")[1];
+
+ List headers = new ArrayList<>();
+ for (int h = 2; h < requestsLines.length; h++) {
+ String header = requestsLines[h];
+ headers.add(header);
+ }
+
+ String accessLog = String.format("Client %s, method %s, path %s, version %s, host %s, headers %s",
+ client.toString(), method, path, version, host, headers.toString());
+ System.out.println(accessLog);
+
+ String contentType = "application/json";
+ String dummyContent = "{\"message\":\"This is a dummy server. I am healthy\"}";
+ sendResponse(client, "200 OK", contentType, dummyContent.getBytes());
+ } catch (Exception e) {
+ logger.info("Error in processing "+e.getMessage());
+ }
+
+ }
+
+ private void sendResponse(Socket client, String status, String contentType, byte[] content) throws IOException {
+ OutputStream clientOutput = client.getOutputStream();
+ clientOutput.write(("HTTP/1.1 \r\n" + status).getBytes());
+ clientOutput.write(("ContentType: " + contentType + "\r\n").getBytes());
+ clientOutput.write("\r\n".getBytes());
+ clientOutput.write(content);
+ clientOutput.write("\r\n\r\n".getBytes());
+ clientOutput.flush();
+ client.close();
+ }
+
+}
diff --git a/core-java/threaddump/src/main/java/io/pratik/threadops/ThreadMXBeanSample.java b/core-java/threaddump/src/main/java/io/pratik/threadops/ThreadMXBeanSample.java
new file mode 100644
index 0000000..87ec8c2
--- /dev/null
+++ b/core-java/threaddump/src/main/java/io/pratik/threadops/ThreadMXBeanSample.java
@@ -0,0 +1,57 @@
+/**
+ *
+ */
+package io.pratik.threadops;
+
+import java.lang.management.ManagementFactory;
+import java.lang.management.ThreadInfo;
+import java.lang.management.ThreadMXBean;
+import java.util.logging.Logger;
+
+/**
+ * @author pratikdas
+ *
+ */
+public class ThreadMXBeanSample {
+ private static final Logger logger = Logger.getLogger(ThreadMXBeanSample.class.getName());
+
+ public static void main(String[] args) {
+ startThreads();
+ ThreadMXBean threadMxBean = ManagementFactory.getThreadMXBean();
+ for (ThreadInfo ti : threadMxBean.dumpAllThreads(true, true)) {
+
+ logger.info(ti.toString());
+ }
+
+ logger.info("\nGeneral Thread information");
+ logger.info(("Number of live threads :" + threadMxBean.getThreadCount()));
+ logger.info("Total CPU time for the current thread: " + threadMxBean.getCurrentThreadCpuTime());
+ logger.info("Current number of live daemon threads:" + threadMxBean.getDaemonThreadCount());
+ logger.info("Peak live thread count :" + threadMxBean.getPeakThreadCount());
+ logger.info("Total number of threads created and started : " + threadMxBean.getTotalStartedThreadCount());
+ }
+
+ /**
+ * Starts two threads thread1 and thread2 and calls their synchronized methods
+ * in the run method resulting in a deadlock.
+ */
+ private static void startThreads() {
+ final ThreadSample thread1 = new ThreadSample();
+ final ThreadSample thread2 = new ThreadSample();
+ Thread t1 = new Thread("Thread1") {
+ public void run() {
+ thread1.executeMethod1(thread2);
+ }
+ };
+
+ Thread t2 = new Thread("Thread2") {
+ @Override
+ public void run() {
+ thread2.executeMethod2(thread1);
+ }
+ };
+
+ t1.start();
+ t2.start();
+ }
+}
diff --git a/core-java/threaddump/src/main/java/io/pratik/threadops/ThreadSample.java b/core-java/threaddump/src/main/java/io/pratik/threadops/ThreadSample.java
new file mode 100644
index 0000000..aff20b4
--- /dev/null
+++ b/core-java/threaddump/src/main/java/io/pratik/threadops/ThreadSample.java
@@ -0,0 +1,32 @@
+/**
+ *
+ */
+package io.pratik.threadops;
+
+import java.util.logging.Logger;
+
+/**
+ * @author pratikdas
+ *
+ */
+public class ThreadSample {
+ private static final Logger logger = Logger.getLogger(ThreadSample.class.getName());
+
+ synchronized void executeMethod1(final ThreadSample thread) {
+ log("Thread " + Thread.currentThread().getName() + " is executing");
+ thread.executeMethod2(this);
+ log(Thread.currentThread().getName() + " has finished method execution");
+ }
+
+ synchronized void executeMethod2(final ThreadSample thread) {
+ log("Thread " + Thread.currentThread().getName() + " is executing");
+ thread.executeMethod1(this);
+ log(Thread.currentThread().getName() + " has finished method execution");
+ }
+
+ private void log(final String message) {
+ System.out.println(message);
+ //logger.info(message);
+ }
+
+}
diff --git a/core-java/threaddump/src/test/java/io/pratik/AppTest.java b/core-java/threaddump/src/test/java/io/pratik/AppTest.java
new file mode 100644
index 0000000..99384f1
--- /dev/null
+++ b/core-java/threaddump/src/test/java/io/pratik/AppTest.java
@@ -0,0 +1,38 @@
+package io.pratik;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest
+ extends TestCase
+{
+ /**
+ * Create the test case
+ *
+ * @param testName name of the test case
+ */
+ public AppTest( String testName )
+ {
+ super( testName );
+ }
+
+ /**
+ * @return the suite of tests being tested
+ */
+ public static Test suite()
+ {
+ return new TestSuite( AppTest.class );
+ }
+
+ /**
+ * Rigourous Test :-)
+ */
+ public void testApp()
+ {
+ assertTrue( true );
+ }
+}