May 12, 2023

худший программист

Потоки

для того, чтобы создать поток в java необходимо создать свой класс, который наследуется от Thread и переопределить там метод run()

чтобы запустить поток, необходимо написать start()

public class HelloWorld { 
  public static class MyThread extends Thread { 
    @Override 
    public void run() { 
      System.out.println("Hello, World!"); 
    } 
  }
   
  public static void main(String []args) { 
    Thread thread = new MyThread(); 
    thread.start(); 
  } 
}

Как видим, запуск задачи выполняется в методе run, а запуск потока в методе start. Не стоит их путать, т.к. если мы запустим метод run напрямую, никакой новый поток не будет запущен. Именно метод start просит JVM создать новый поток.

можно создать поток по-другому, используя Runnable

public class HelloWorld {
  public static void main(String []args) {
    Runnable task = new Runnable() {
      public void run() {
        System.out.println("Hello, World!");
      }
    };
    Thread thread = new Thread(task);
    thread.start();
  }
}

либо

public class HelloWorld {
  public static void main(String []args) {
    Runnable task = () -> {
      System.out.println("Hello, World!");
    };
    Thread thread = new Thread(task);
    thread.start();
  }
}

Потоков так таковых не существует, два потока не работают параллельно

На самом деле java быстро переключает потоки, тем самым имитируя параллельную работу

метод sleep позволяет программе заснуть на определенное количество миллисекунд

Thread.sleep(millisec); 

для использования sleep нужно обработать исключение InterruptedException

оно выбрасывается, если поток был прерван снаружи с помощью метода

thread.interrupt();

Самым простым типом ожидания является ожидание завершения другого потока

thread.join();

если какие-нибудь два потока изменяют какой-то объект, то их надо сихронизировать

Работа с файлами

InputStream - работает с байтами(ввод)

OutputStream - работает с байтами(вывод)

Reader - работает с символами(ввод)

Writer - работает с символами(вывод)

Для чтения байтов из файлов FileInputStream, для записи байтов FileOutputStream

Методы в FileInputStream:

  • FileInputStream(String fileName) - конструктор, принимает путь до файла(включая сам файл)
  • int read() - считывает один байт, возвращает инт
  • int available() - возвращает количество непрочитанных байт
  • void close() - закрывает поток, после окончания работы с ним

Методы в FileOutputStream:

  • FileOutputStream(String fileName) - конструктор, принимает путь до файла(включая сам файл)
  • void write(int data) - метод записывает байт
  • void flush() - принудительно записывает данные в файл
  • void close() - закрывает поток, после окончания работы с ним

BufferedInputStream и BufferedOutputStream - обертки(decorator) для InputStream и OutputStream

принимают много данных в буфер
и потихоньку выдают его нам

Методы класса File

Работа с API

<dependency>
  <groupId>com.googlecode.json-simple</groupId>
  <artifactId>json-simple</artifactId>
  <version>1.1.1</version>
</dependency>