Многопоточное программирование на основе Java

Java

рассмотрение

в предыдущем постеБазовый поток JavaМы ввели родственные понятия о потоках и процессах, а тему оставили: то есть задачу продажи 100 билетов в трех окнах одновременно, поэтому сегодня поговорим о реализации многопоточного программирования.

Существует два основных способа построения многопоточности: наследование и реализация.

Многопоточное создание

1. Наследовать класс Thread

Унаследованный метод заключается в создании класса, наследуемого от класса Thread, и реализации метода запуска следующим образом.

class SubThread extends  Thread{
    @Override
    public void run() {
       //具体需要完成的业务代码
    }
}
SubThread subThread=new SubThread();//创建实例
subThread.start();//线程启动
  • Метод start запускает поток и выполняет соответствующий метод run.
  • Бизнес-код, который необходимо реализовать, необходимо поместить в метод запуска.

2. Реализуйте интерфейс Runnable

Реализовать интерфейс java.lang.Runnable.

class SubThread implements Runnable{//创建一个实现Runnable接口的类
    @Override
    public void run() {//实现run方法
     //你的业务代码
    }
}
SubThread subThread1=new SubThread();//创建一个实例
Thread t1=new Thread(subThread1);//把实例当参数传递给Thread构造方法 //得到一个线程实例
t1.start();//调用线程实例的start方法

несколько важных шагов

  • 1 Создайте класс, реализующий интерфейс Runnable
  • 2 Перепишите метод run и напишите свой бизнес-код в run
  • 3 Создайте этот экземпляр класса и получите пример потока в конструкторе класса THREAD.
  • 4 Экземпляр потока вызывает метод start

3. Некоторые базовые методы класса Thred

Thread.currentThread() //获取当前线程
//以下都是线程实例上的方法
setName(); //设置线程名字
getName(); //获取线程名字
yield();//显示释放cpu的执行权  
join();//在一个线程执行中调用另一个目标线程的join方法,意味着立马执行目标线程,且执行完毕才回到原线程
isAlive();//判断当前线程是否还存活
sleep();//显示的让线程睡眠
setPriority() //设置当前线程的优先级
getPriority()//获取当前线程的优先级

4. Противопоставление наследования и реализации

Оба связаны с интерфейсом Runnable

Код бизнес-объекта помещается в метод запуска

Ввиду особенностей одинарного реле java способ реализации интерфейса является более общим.

Если несколько потоков работают с одним и тем же ресурсом, лучше использовать метод реализации

Процедура оформления билетов

В предыдущей статье мы оставили вопрос: есть три окошка для продажи билетов, всего билетов 100, давайте реализовывать

1. Унаследованные методы

class Window extends  Thread{//继承
    static int ticket=100;
    @Override
    public void run() {
        while (true){
            if(ticket>0){
                System.out.println(Thread.currentThread().getName()+"售票:票号为:"+ ticket--);
            }else{
                break;
            }
        }
    }
}
//创建三个线程实例
Window w1=new Window();
Window w2=new Window();
Window w3=new Window();
w1.setName("窗口1");
w2.setName("窗口2");
w3.setName("窗口3");
w1.start();
w2.start();
w3.start();

Так как всего продано 100 билетов, необходимо сделать билет статическим, и эти три потока делят эти данные.

2. Способ реализации

class Window implements Runnable{//实现接口
    int ticket=100;
    @Override
    public void run() {
        while (true){
            if(ticket>0){
                System.out.println(Thread.currentThread().getName()+"售票:票号为:"+ ticket--);
            }else{
                break;
            }
        }
    }
}

//构建三个线程实例
Window w=new Window();
Thread t1=new Thread(w);
Thread t2=new Thread(w);
Thread t3=new Thread(w);
t1.setName("窗口1");
t2.setName("窗口2");
t3.setName("窗口3");
t1.start();
t2.start();
t3.start();

Примечание. Поскольку существует только один экземпляр Window, имеется только один билет = 100, статическая модификация не требуется.

Преимущества и недостатки многопоточных программ

В эпоху одноядерных многопоточность приведет к потере переключения потоков, но даже эта многопоточность более значима для графического интерфейса, она может улучшить взаимодействие с пользователем. (Например, вы пишете код и слушаете музыку на одноядерной машине.) На самом деле несколько потоков переключаются взад и вперед на процессоре, создавая иллюзию параллелизма.

Например, в эпоху многоядерности текущий процессор i7 8-го поколения имеет 6 ядер и 12 потоков, которые могут поддерживать параллельные операции нескольких потоков, значительно повышать производительность и использовать многопоточное программирование. Напротив, это может улучшить использование процессора компьютера.

Кроме того, многопоточное программирование может улучшить структуру программы, которая может разделить длинные и сложные процессы на несколько потоков и выполняться независимо, что способствует пониманию и модификации.

Суммировать

Сегодня я в основном объясню, как реализовать многопоточность и какие методы доступны для экземпляров потоков.Необходимо сосредоточиться на методе реализации, потому что метод реализации позволяет избежать недостатков одиночного наследования Java.

Однако пример кода в этой статье не ориентирован на многопотоковое исполнение. Безопасность потоков мы объясним в следующей статье.

Друзья, которым понравилась эта статья, пожалуйста, нажмите и удерживайте изображение, чтобы подписаться на номер подписки «Мои заметки по программированию» и смотреть больше захватывающего контента~~