Advertisement
Guest User

multithreading

a guest
Mar 19th, 2020
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.22 KB | None | 0 0
  1. import map.Coordinates;
  2. import map.Map;
  3. import org.javatuples.Pair;
  4. import social.User;
  5. import xmlSaver.XML;
  6. import xmlSaver.XmlDeserializer;
  7. import xmlSaver.XmlSerializer;
  8. import xmlSaver.XmlSerializerRegistry;
  9.  
  10. import java.io.IOException;
  11. import java.nio.file.Files;
  12. import java.nio.file.Paths;
  13. import java.util.*;
  14. import java.util.concurrent.TimeUnit;
  15.  
  16. @XML
  17. public class ConsoleUI {
  18.  
  19.     @XML
  20.     private Map map = new Map();
  21.     @XML
  22.     private List<User> users = new ArrayList<>();
  23.     @XML
  24.     private ArrayList<String> randomNames;
  25.  
  26.     {
  27.         try {
  28.             randomNames = new ArrayList<>(Arrays.asList(Files.readAllLines(Paths.get("src/main/java/names.txt")).toString().split(" ")));
  29.         } catch (IOException e) {
  30.             System.out.println("Something went wrong..." + e.getMessage());
  31.         }
  32.     }
  33.  
  34.     @XML
  35.     private java.util.Map<Thread, User> threads = new HashMap<>();
  36.  
  37.     //private Thread currThread; //костыль видимо, нужен чтобы запоминать текущий поток, чтоб потом его там сохарнить в список
  38.  
  39.     private static final XmlSerializerRegistry registry;
  40.  
  41.     static {
  42.         registry = new XmlSerializerRegistry();
  43.         try {
  44.             registry.addClass(
  45.                 Pair.class,
  46.                 () -> Pair.with(new Object(), new Object()),
  47.                 Pair.class.getDeclaredField("val0"),
  48.                 Pair.class.getDeclaredField("val1")
  49.             );
  50.         } catch (NoSuchFieldException e) {
  51.             e.printStackTrace();
  52.         }
  53.  
  54.         try {
  55.             registry.addClass(
  56.                 Date.class,
  57.                 Date::new,
  58.                 Date.class.getDeclaredField("fastTime")
  59.             );
  60.         } catch (NoSuchFieldException e) {
  61.             e.printStackTrace();
  62.         }
  63.     }
  64.  
  65.     public ConsoleUI() {
  66.     }
  67.  
  68.     @XML
  69.     User user1 = new User("Putin");
  70.     @XML
  71.     User user2 = new User("Medvedev");
  72.  
  73.     public void run() {
  74.         user2.addFriend(user1);
  75.         user1.setCoordinates(new Coordinates(20, 10));
  76.         while (true) {
  77.             var scan = new Scanner(System.in);
  78.             var input = scan.nextLine();
  79.             if (input.equals("1")) {
  80.                 user1.checkIn(map, user1.getCoordinates());
  81.             }
  82.             if (input.equals("2"))
  83.                 XmlSerializer.saveXml(this, "test.xml", registry);
  84.             if (input.equals("3"))
  85.                 XmlDeserializer.loadXml("test.xml", registry);
  86.             if (input.equals("4"))
  87.                 break;
  88.             if (input.equals("5")) {
  89.                 var t = new Thread(this::live);
  90.                 t.start();
  91.                 threads.put(t, null);
  92.                 //currThread = t;
  93.             }
  94.             if (input.equals("6")) {
  95.                 users.forEach(System.out::println);
  96.                 var scan2 = new Scanner(System.in);
  97.                 var input2 = scan2.nextInt();
  98.                 users.get(input2).setAlive(false);
  99.                 users.remove(input2);
  100.             }
  101.             if (input.equals("7")) {
  102.                 users.forEach(x -> {
  103.                     System.out.println(x.getName() + "'s log:");
  104.                     x.getLog().forEach(System.out::println);
  105.                     System.out.println("\n");
  106.                 });
  107.             }
  108.  
  109.         }
  110.     }
  111.  
  112.     private void live() {
  113.         var lifeCycle = System.nanoTime();
  114.         var countOfCheckIn = 0;
  115.         var random = new Random();
  116.         var user = new User(randomNames.get(random.nextInt(randomNames.size())));
  117.         user.setCoordinates(new Coordinates(random.nextInt(3), random.nextInt(3)));
  118.         users.add(user);
  119.         threads.put(Thread.currentThread(), user); //overwrite value
  120.         while (user.isAlive()) {
  121.             if (TimeUnit.SECONDS.convert(System.nanoTime() - lifeCycle, TimeUnit.NANOSECONDS) >= 120) {
  122.                 user.setAlive(false);
  123.             }
  124.  
  125.             var activeThreads = new Thread[Thread.activeCount()];
  126.             Thread.enumerate(activeThreads);
  127.             Thread mainThread = Arrays.stream(activeThreads).
  128.                 filter(x -> x.getName().equals("main")).
  129.                 findAny().orElse(null);
  130.             assert mainThread != null;
  131.             synchronized (mainThread) {
  132.                 try {
  133.                     mainThread.wait();
  134.                 } catch (InterruptedException e) {
  135.                     e.printStackTrace();
  136.                 }
  137.             }
  138.  
  139.             System.out.println("hi there");
  140.             wake();
  141.             if (countOfCheckIn >= 3) {
  142.                 synchronized (this) {
  143.                     try {
  144.                         System.out.println("я туточки");
  145.                         wait();
  146.                         Thread.sleep(10000); // проснулся и немного ждет, расягиваем во времени жизнь юзера
  147.                     } catch (InterruptedException e) {
  148.                         System.out.println("Че-то с потоками" + e.getMessage());
  149.                     }
  150.                 }
  151.                 countOfCheckIn = 0;
  152.             }
  153.  
  154.             try {
  155.                 Thread.sleep(1000);
  156.             } catch (InterruptedException e) {
  157.                 e.printStackTrace();
  158.             }
  159.             System.out.println("прошел через огонь и медные трубы");
  160.             user.randomCheckIn(map, user.getCoordinates());
  161.             user.setCoordinates(new Coordinates(random.nextInt(3), random.nextInt(3)));
  162.             countOfCheckIn++;
  163.         }
  164.     }
  165.  
  166.     private synchronized void wake() {
  167. //        System.out.println(Thread.currentThread().toString());
  168.         Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
  169.         threadSet.forEach(x -> System.out.println(x.toString()));
  170.         var activeThreads = new Thread[Thread.activeCount()];
  171.         Thread.enumerate(activeThreads);
  172.         Thread mainThread = Arrays.stream(activeThreads).
  173.             filter(x -> x.getName().equals("main")).
  174.             findAny().orElse(null);
  175.         assert mainThread != null;
  176.             synchronized (mainThread) {
  177.                 mainThread.notifyAll();
  178.             }
  179.     }
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement