рассмотрение
в предыдущем постеБазовый поток 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.
Однако пример кода в этой статье не ориентирован на многопотоковое исполнение. Безопасность потоков мы объясним в следующей статье.
Друзья, которым понравилась эта статья, пожалуйста, нажмите и удерживайте изображение, чтобы подписаться на номер подписки «Мои заметки по программированию» и смотреть больше захватывающего контента~~