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