diff --git a/projects/DPetrukhin/pom.xml b/projects/DPetrukhin/pom.xml
new file mode 100644
index 0000000..eeab5cf
--- /dev/null
+++ b/projects/DPetrukhin/pom.xml
@@ -0,0 +1,78 @@
+
+ 4.0.0
+
+
+ ru.mipt.diht.students
+ parent
+ 1.0-SNAPSHOT
+
+
+ ru.mipt.diht.students
+ DPetrukhin
+ 1.0-SNAPSHOT
+ DPetrukhin
+ http://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+
+ maven-assembly-plugin
+
+
+ package
+
+ single
+
+
+
+
+
+ jar-with-dependencies
+
+
+
+
+
+
+
+
+
+
+
+
+
+ junit
+ junit
+ 3.8.1
+ test
+
+
+
+
+ org.twitter4j
+ twitter4j-core
+ [4.0,)
+
+
+ org.twitter4j
+ twitter4j-stream
+ [4.0,)
+
+
+ com.h2database
+ h2
+ 1.4.190
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+
\ No newline at end of file
diff --git a/projects/DPetrukhin/src/main/java/ru/mipt/diht/students/dpetrukhin/threads/BlockingQueue.java b/projects/DPetrukhin/src/main/java/ru/mipt/diht/students/dpetrukhin/threads/BlockingQueue.java
new file mode 100644
index 0000000..2f252c6
--- /dev/null
+++ b/projects/DPetrukhin/src/main/java/ru/mipt/diht/students/dpetrukhin/threads/BlockingQueue.java
@@ -0,0 +1,156 @@
+package ru.mipt.diht.students.dpetrukhin.threads;
+
+import java.util.*;
+
+/**
+ * Created by daniel on 19.12.15.
+ */
+
+public class BlockingQueue {
+ private Object queueAccessSyncObj = new Object();
+ private Object actionSyncObj = new Object();
+ private int maxQueueSize;
+ private int queueSize;
+ private volatile long currentOfferCounter;
+ private volatile long currentTakeCounter;
+ private long offerCounter;
+ private long takeCounter;
+ private List queue;
+
+ public BlockingQueue(final int newMaxQueueSize) {
+ maxQueueSize = newMaxQueueSize;
+ currentOfferCounter = 0;
+ currentTakeCounter = 0;
+ offerCounter = 0;
+ takeCounter = 0;
+ queueSize = 0;
+ queue = new LinkedList<>();
+ }
+
+ public final void offer(final List list) {
+ offer(list, 0);
+ }
+
+ public final void offer(final List list, final long timeout) {
+ final boolean existTimeLimit;
+ if (timeout > 0) {
+ existTimeLimit = true;
+ } else {
+ existTimeLimit = false;
+ }
+ long timeToStop = System.currentTimeMillis() + timeout;
+ long timeToSleep;
+
+ if (list.size() > maxQueueSize) {
+ return;
+ }
+ long orderNumber;
+
+ synchronized (actionSyncObj) {
+ orderNumber = offerCounter++;
+ if (offerCounter == Long.MAX_VALUE) {
+ offerCounter = 0;
+ }
+ }
+
+ try {
+ synchronized (actionSyncObj) {
+ while (true) {
+ if (currentOfferCounter == orderNumber) {
+ if (list.size() + queueSize <= maxQueueSize) {
+ synchronized (actionSyncObj) {
+ queue.addAll(list);
+ queueSize += list.size();
+ }
+
+ ++currentOfferCounter;
+ actionSyncObj.notifyAll();
+ throw new InterruptedException("");
+ }
+ }
+ actionSyncObj.notifyAll();
+ if (existTimeLimit) {
+ timeToSleep = timeToStop - System.currentTimeMillis();
+ if (timeToSleep <= 0) {
+ ++currentOfferCounter;
+ actionSyncObj.notifyAll();
+ throw new InterruptedException("");
+ }
+ actionSyncObj.wait(timeToSleep);
+ } else {
+ actionSyncObj.wait();
+ }
+ }
+ }
+ } catch (InterruptedException e) {
+ return;
+ }
+ }
+
+ public final List take(final int qnt) {
+ return take(qnt, 0);
+ }
+
+ public final List take(final int qnt, final long timeout) {
+ final boolean existTimeLimit;
+ if (timeout > 0) {
+ existTimeLimit = true;
+ } else {
+ existTimeLimit = false;
+ }
+ long timeToStop = System.currentTimeMillis() + timeout;
+ long timeToSleep;
+
+ if (qnt == 0) {
+ return new LinkedList<>();
+ }
+
+ if (qnt > maxQueueSize) {
+ return null;
+ }
+
+ long orderNumber;
+
+ synchronized (actionSyncObj) {
+ orderNumber = takeCounter++;
+ if (takeCounter == Long.MAX_VALUE) {
+ takeCounter = 0;
+ }
+ }
+
+ try {
+ synchronized (actionSyncObj) {
+ while (true) {
+ if (currentTakeCounter == orderNumber) {
+ if (qnt <= queueSize) {
+ List answer;
+ synchronized (actionSyncObj) {
+ answer = new LinkedList<>(queue.subList(0, qnt));
+ queue.subList(0, qnt).clear();
+ queueSize -= qnt;
+ }
+
+ ++currentTakeCounter;
+ actionSyncObj.notifyAll();
+ return answer;
+ }
+ }
+ actionSyncObj.notifyAll();
+ if (existTimeLimit) {
+ timeToSleep = timeToStop - System.currentTimeMillis();
+ if (timeToSleep <= 0) {
+ ++currentTakeCounter;
+ actionSyncObj.notifyAll();
+ throw new InterruptedException("");
+ }
+ actionSyncObj.wait(timeToSleep);
+ } else {
+ actionSyncObj.wait();
+ }
+ }
+ }
+ } catch (InterruptedException e) {
+ return null;
+ }
+ }
+}
diff --git a/projects/DPetrukhin/src/main/java/ru/mipt/diht/students/dpetrukhin/threads/Counter.java b/projects/DPetrukhin/src/main/java/ru/mipt/diht/students/dpetrukhin/threads/Counter.java
new file mode 100644
index 0000000..a8d2c01
--- /dev/null
+++ b/projects/DPetrukhin/src/main/java/ru/mipt/diht/students/dpetrukhin/threads/Counter.java
@@ -0,0 +1,53 @@
+package ru.mipt.diht.students.dpetrukhin.threads;
+
+/**
+ * Created by daniel on 19.12.15.
+ */
+final class Counter {
+ private Counter() {
+ }
+
+ private static int countLast = 0;
+ private static int totalNumber;
+
+ private static final int TIME = 1000;
+
+ private static Object syncObj = new Object();
+
+ private static void runner(final int myNumber) {
+ Thread thread = new Thread() {
+ @SuppressWarnings("checkstyle.magicnumber")
+ @Override
+ public void run() {
+ try {
+ synchronized (syncObj) {
+ while (true) {
+ if (myNumber == countLast) {
+ System.out.print("Thread-" + myNumber + "\n");
+ ++countLast;
+ if (countLast == totalNumber) {
+
+ Thread.sleep(TIME); //just for view
+ countLast = 0;
+ }
+ syncObj.notifyAll();
+ } else {
+ syncObj.wait();
+ }
+ }
+ }
+ } catch (InterruptedException e) {
+ }
+ }
+ };
+
+ thread.start();
+ }
+
+ public static void main(final String[] arg) {
+ totalNumber = new Integer(arg[0]);
+ for (int i = 0; i < totalNumber; ++i) {
+ runner(i);
+ }
+ }
+}
diff --git a/projects/DPetrukhin/src/main/java/ru/mipt/diht/students/dpetrukhin/threads/Rollcall.java b/projects/DPetrukhin/src/main/java/ru/mipt/diht/students/dpetrukhin/threads/Rollcall.java
new file mode 100644
index 0000000..6b0cd4c
--- /dev/null
+++ b/projects/DPetrukhin/src/main/java/ru/mipt/diht/students/dpetrukhin/threads/Rollcall.java
@@ -0,0 +1,90 @@
+package ru.mipt.diht.students.dpetrukhin.threads;
+
+import java.util.Random;
+
+/**
+ * Created by daniel on 19.12.15.
+ */
+
+final class Rollcall {
+ private Rollcall() {
+ }
+
+ private static Random random = new Random();
+ private static int counter = 0;
+ private static int answers = 0;
+ private static boolean exitFlag = false;
+ private static int totalNumber;
+
+ public static final int TIME = 1000;
+ public static final int PROBABILITY = 10;
+
+ private static Object syncObj = new Object();
+
+ private static void startThread() {
+ Thread thread = new Thread() {
+ @SuppressWarnings("checkstyle.magicnumber")
+ @Override
+ public void run() {
+ try {
+ synchronized (syncObj) {
+ while (true) {
+ if (exitFlag) {
+ throw new InterruptedException("");
+ }
+ if (counter < totalNumber) {
+
+ if (random.nextInt(PROBABILITY) == 0) {
+ System.out.print("No\n");
+ } else {
+ System.out.print("Yes\n");
+ ++answers;
+ }
+ ++counter;
+ syncObj.notifyAll();
+ }
+
+ syncObj.wait();
+ }
+ }
+ } catch (InterruptedException e) {
+ return;
+ }
+ }
+ };
+
+ thread.start();
+ }
+
+ public static void main(final String[] arg) {
+ totalNumber = new Integer(arg[0]);
+ counter = totalNumber;
+ for (int i = 0; i < totalNumber; ++i) {
+ startThread();
+ }
+
+ try {
+ synchronized (syncObj) {
+ while (true) {
+ if (counter == totalNumber) {
+ if (answers < totalNumber) {
+ System.out.print("Are you ready?\n");
+ answers = 0;
+ counter = 0;
+ Thread.sleep(TIME); //just for view
+ } else {
+ exitFlag = true;
+ syncObj.notifyAll();
+ throw new InterruptedException("");
+ }
+ syncObj.notifyAll();
+ } else {
+ syncObj.wait();
+ }
+ }
+ }
+ } catch (InterruptedException e) {
+ return;
+ }
+ }
+}
diff --git a/projects/DPetrukhin/src/main/java/ru/mipt/diht/students/dpetrukhin/twitterstream/GeolocationSearch.java b/projects/DPetrukhin/src/main/java/ru/mipt/diht/students/dpetrukhin/twitterstream/GeolocationSearch.java
new file mode 100644
index 0000000..f5f5359
--- /dev/null
+++ b/projects/DPetrukhin/src/main/java/ru/mipt/diht/students/dpetrukhin/twitterstream/GeolocationSearch.java
@@ -0,0 +1,7 @@
+package ru.mipt.diht.students.dpetrukhin.twitterstream;
+
+/**
+ * Created by daniel on 19.12.15.
+ */
+public class GeolocationSearch {
+}
diff --git a/projects/DPetrukhin/src/main/java/ru/mipt/diht/students/dpetrukhin/twitterstream/JCommanderTwitterStream.java b/projects/DPetrukhin/src/main/java/ru/mipt/diht/students/dpetrukhin/twitterstream/JCommanderTwitterStream.java
new file mode 100644
index 0000000..2695e0a
--- /dev/null
+++ b/projects/DPetrukhin/src/main/java/ru/mipt/diht/students/dpetrukhin/twitterstream/JCommanderTwitterStream.java
@@ -0,0 +1,7 @@
+package ru.mipt.diht.students.dpetrukhin.twitterstream;
+
+/**
+ * Created by daniel on 19.12.15.
+ */
+public class JCommanderTwitterStream {
+}
diff --git a/projects/DPetrukhin/src/main/java/ru/mipt/diht/students/dpetrukhin/twitterstream/TSWordsForm.java b/projects/DPetrukhin/src/main/java/ru/mipt/diht/students/dpetrukhin/twitterstream/TSWordsForm.java
new file mode 100644
index 0000000..fe408cb
--- /dev/null
+++ b/projects/DPetrukhin/src/main/java/ru/mipt/diht/students/dpetrukhin/twitterstream/TSWordsForm.java
@@ -0,0 +1,7 @@
+package ru.mipt.diht.students.dpetrukhin.twitterstream;
+
+/**
+ * Created by daniel on 19.12.15.
+ */
+public class TSWordsForm {
+}
diff --git a/projects/DPetrukhin/src/main/java/ru/mipt/diht/students/dpetrukhin/twitterstream/TwitterStream.java b/projects/DPetrukhin/src/main/java/ru/mipt/diht/students/dpetrukhin/twitterstream/TwitterStream.java
new file mode 100644
index 0000000..fbc526d
--- /dev/null
+++ b/projects/DPetrukhin/src/main/java/ru/mipt/diht/students/dpetrukhin/twitterstream/TwitterStream.java
@@ -0,0 +1,7 @@
+package ru.mipt.diht.students.dpetrukhin.twitterstream;
+
+/**
+ * Created by daniel on 19.12.15.
+ */
+public class TwitterStream {
+}
diff --git a/projects/DPetrukhin/src/main/java/ru/mipt/diht/students/dpetrukhin/twitterstream/URLs.java b/projects/DPetrukhin/src/main/java/ru/mipt/diht/students/dpetrukhin/twitterstream/URLs.java
new file mode 100644
index 0000000..d8eaa66
--- /dev/null
+++ b/projects/DPetrukhin/src/main/java/ru/mipt/diht/students/dpetrukhin/twitterstream/URLs.java
@@ -0,0 +1,7 @@
+package ru.mipt.diht.students.dpetrukhin.twitterstream;
+
+/**
+ * Created by daniel on 19.12.15.
+ */
+public class URLs {
+}
diff --git a/projects/DPetrukhin/src/test/java/ru/mipt/diht/students/dpetrukhin/twitterstream/TwitterStreamService.java b/projects/DPetrukhin/src/test/java/ru/mipt/diht/students/dpetrukhin/twitterstream/TwitterStreamService.java
new file mode 100644
index 0000000..9d5f5c1
--- /dev/null
+++ b/projects/DPetrukhin/src/test/java/ru/mipt/diht/students/dpetrukhin/twitterstream/TwitterStreamService.java
@@ -0,0 +1,15 @@
+package ru.mipt.diht.students.dpetrukhin.moduletests;
+
+/**
+ * Created by daniel on 19.12.15.
+ */
+import twitter4j.Status;
+
+import java.time.LocalDateTime;
+
+public interface TwitterStreamService {
+ String getForm(Integer n, String[] forms);
+ String getTimeBetweenForm(LocalDateTime tweetLDT, LocalDateTime nowLDT);
+ String getRetweetsForm(Integer retweets);
+ String getTimeForm(Status tweet, LocalDateTime localDateTime);
+}
\ No newline at end of file
diff --git a/projects/DPetrukhin/src/test/java/ru/mipt/diht/students/dpetrukhin/twitterstream/TwitterStreamServiceImpl.java b/projects/DPetrukhin/src/test/java/ru/mipt/diht/students/dpetrukhin/twitterstream/TwitterStreamServiceImpl.java
new file mode 100644
index 0000000..ffb2e17
--- /dev/null
+++ b/projects/DPetrukhin/src/test/java/ru/mipt/diht/students/dpetrukhin/twitterstream/TwitterStreamServiceImpl.java
@@ -0,0 +1,31 @@
+package ru.mipt.diht.students.dpetrukhin.moduletests;
+
+/**
+ * Created by daniel on 19.12.15.
+ */
+import ru.mipt.diht.students.dpetrukhin.twitterstream.TSWordsForm;
+import twitter4j.Status;
+
+import java.time.LocalDateTime;
+
+public class TwitterStreamServiceImpl implements TwitterStreamService {
+ @Override
+ public String getTimeBetweenForm(LocalDateTime tweetLDT, LocalDateTime nowLDT) {
+ return TSWordsForm.getTimeBetweenForm(tweetLDT, nowLDT);
+ }
+
+ @Override
+ public String getForm(Integer n, String[] forms) {
+ return TSWordsForm.getForm(n, forms);
+ }
+
+ @Override
+ public String getTimeForm(Status tweet, LocalDateTime localDateTime) {
+ return TSWordsForm.getTimeForm(tweet, localDateTime);
+ }
+
+ @Override
+ public String getRetweetsForm(Integer retweets) {
+ return TSWordsForm.getRetweetsForm(retweets);
+ }
+}
\ No newline at end of file
diff --git a/solutions/DPetrukhin/reverser.java b/solutions/DPetrukhin/reverser.java
new file mode 100644
index 0000000..3d6ec8e
--- /dev/null
+++ b/solutions/DPetrukhin/reverser.java
@@ -0,0 +1,15 @@
+package ru.mipt.diht.students.dpetrukhin.reverser;
+
+/**
+ * Created by daniel on 19.12.15.
+ */
+public class reverser {
+ public static void main(String[] args) {
+ for (int i = args.length - 1; i >= 0; --i) {
+ String[] splitted = args[i].split("\\s+");
+ for (int j = splitted.length - 1; j >= 0; --j) {
+ System.out.print(splitted[j]);
+ }
+ }
+ }
+}
\ No newline at end of file