Прошло два года, прежде чем я понял, как реализовать многопоточность, эй!
1. Почему эта статья
Время летит назад, в 2017 год, в конец года;самообучениеПолное программирование и три фреймворка можно описать какПолный уверенности, меч указывает на предложение.
Как всем известно, вв первом интервью, дал интервью молодой Ян (молодой) интервьюерУрок; годы прошли,Можно охарактеризовать как свежую в памяти.
- Сяо Ян: Давай, поговорим о многопоточности.
- Корова: поток — это единица выполнения в процессе. . .
- Сяо Ян: Существует несколько способов реализации многопоточности
- Аниу: 2 вида (без раздумий, кто не знает!!)
- Сяо Ян: Какая между ними разница?
- Аниу: Хм. . . (мгновенно ошеломленный Б)
Таким образом, я опасался, принимая различные пытки от Сяо Яна, и в конце концов получил "Вернитесь и дождитесь уведомления" и конец;
После интервью, хотя я и смутно догадываюсь о результате, мне тоже не терпится попасть на небеса и склонить чашу весов в свою пользу;
Аниу ждал несколько дней, это было как три осени, и результат былGGИ конец.
Во-вторых, поговорим, как добиться многопоточности
Как вы все знаете, программазаявление о прыжкеИсходя из того, что обасверху донизуВыполнять последовательно.
Тогда теперь хочу разработать программу",код рядом"а также"Во время просмотра блокбастеров (серьезные люди)", как оформить?Во-первых, чтобы решить вышеуказанную проблему, мы должныпоговорим о многопоточности, то вы должны сначала понять, что такоенитьа такжеобработать
существует"идеи программирования на Java"КнигаМодуль параллелизмаВ , есть два предложения для описания процессов и потоков
обработать: Относится к прикладной программе, работающей в памяти, каждый процесс имеет независимое пространство памяти, процесс фактически является процессом выполнения программы и является базовой единицей работающей программы системы.
нить: относится к одному последовательному потоку управления в процессе
переводить: Thread на самом деле является исполнительной единицей в процессе, отвечающей за выполнение программы в текущем процессе.
Хотя эти два предложения немного абстрактны, они выражают суть потоков и процессов.
Давай, давай посмотрим, "обработать"
Далее, давайте посмотрим на ""нить"
Узнав о потоках и процессах, реализацию многопоточности можно описать как «so easy"
Далее я кратко расскажу о нескольких способах достижения многопоточности.два года спустя"
В-третьих, наследуйте класс Thread, поймите
опять таки "Нагрузка Б«Пора, иди и иди, давай посмотримИсходный код класса Thread
Далее посмотрите на "Класс потока"метод start()"
Как видно из исходного кода,Класс Thread по сути является экземпляром, реализующим интерфейс Runnable.
Таким образом, единственный способ запустить поток — использовать метод start() класса Thread, который являетсясобственный метод, он запускает новый поток,и выполните метод run().
Давай, далее, весь смысл операции САО
Сначала создайтеКласс TestThread(Серьезные люди, не думайте слишком много)
/**
* Create By CodeCow on 2020/8/3.
*/
public class TestThread {
public static void main(String[] args) {
MyThread mt = new MyThread("新线程————看大片");
//开启新线程
mt.start();
//在主方法中执行for循环
for (int i = 0; i < 5; i++) {
System.out.println("main线程————撸代码,没意思。。" + i);
}
}
//继承Thread类
public static class MyThread extends Thread {
//定义指定线程名称的构造方法
public MyThread(String name) {
//调用父类的String参数的构造方法,指定线程的名称(原理:利用继承特点,将线程名称传递)
super(name);
}
//重写run方法,定义线程要执行的代码
@Override
public void run() {
for (int j = 0; j < 5; j++) {
//getName()方法 来自父亲(就是Thread类中,获取当前线程名称方法)
System.out.println(getName() + " :好刺激哟,不行了,快、快。。" + j);
}
}
}
}
Далее, как насчетзапустить тестовый поток, и посмотрим, что получится в результате
Connected to the target VM, address: '127.0.0.1:56321', transport: 'socket'
main线程————撸代码,没意思。。0
main线程————撸代码,没意思。。1
新线程————看大片 :好刺激哟,不行了,快、快。。0
main线程————撸代码,没意思。。2
新线程————看大片 :好刺激哟,不行了,快、快。。1
main线程————撸代码,没意思。。3
新线程————看大片 :好刺激哟,不行了,快、快。。2
新线程————看大片 :好刺激哟,不行了,快、快。。3
新线程————看大片 :好刺激哟,不行了,快、快。。4
main线程————撸代码,没意思。。4
Disconnected from the target VM, address: '127.0.0.1:56321', transport: 'socket'
Легко найти"поток кода"а также"смотреть тред блокбастера' каждый исполнил по пять раз
Поэтому, чтобы запустить поток таким образом, напрямую используйтеВаш собственный класс наследует класс Thread,а такжеПереопределить его метод run()Вы можете начать тему.И выполнить собственное определение метода run(), Это оно. Эта операция,Разве это не 6!
В-четвертых, реализовать интерфейс Runnable, понять
На этот раз я не будуНагрузка Б", давайте посмотрим непосредственноИсходный код класса Runnable
Нетрудно найти из исходного кода, что интерфейс Runnable начинается с "Java1.0«Это уже есть,Внутри него есть только один абстрактный метод run().
Поэтому: Чтобы запустить поток, реализуйте интерфейс Runnable и переопределите его метод run().
- Примечание. Поскольку Java не поддерживает множественное наследование, если ваш класс унаследовал другие классы, вы должны реализовать интерфейс Runnable и переопределить его метод run(), чтобы запустить поток.
Давай, давай, практикуй целую волну
Сначала создайте класс TestRunnable иРеализовать интерфейс Runnable
/**
* Create By CodeCow on 2020/8/3.
*/
public class TestRunnable implements Runnable{
//重写run()方法, 写自己需要的代码
@Override
public void run() {
for (int i = 0; i < 5; i++) {
//currentThread() 返回对当前正在执行的线程对象的引用
System.out.println(Thread.currentThread().getName()+" :好刺激哟,不行了,快、快。。" + i);
}
}
public static void main(String[] args) {
//创建自定义类对象 线程任务对象
TestRunnable mr = new TestRunnable();
//创建线程对象
Thread t = new Thread(mr, "新线程————看大片(正经人别多想)");
t.start();
for (int i = 0; i < 5; i++) {
System.out.println("main线程————撸代码,没意思。。" + i);
}
}
}
Далее, как насчетЗапустить TestRunnable, посмотрим какой будет результат
Connected to the target VM, address: '127.0.0.1:56275', transport: 'socket'
main线程————撸代码,没意思。。0
新线程————看大片(正经人别多想) :好刺激哟,不行了,快、快。。0
main线程————撸代码,没意思。。1
新线程————看大片(正经人别多想) :好刺激哟,不行了,快、快。。1
main线程————撸代码,没意思。。2
新线程————看大片(正经人别多想) :好刺激哟,不行了,快、快。。2
main线程————撸代码,没意思。。3
新线程————看大片(正经人别多想) :好刺激哟,不行了,快、快。。3
main线程————撸代码,没意思。。4
新线程————看大片(正经人别多想) :好刺激哟,不行了,快、快。。4
Disconnected from the target VM, address: '127.0.0.1:56275', transport: 'socket'
Легко найти "поток кода" а также "смотреть тред блокбастераТо же самое исполнялось также по пять раз.устойчивый, устойчивый
Стабильный есть стабильный, но многие точно подумают, что это не Low;
Низкий, низкий до смерти, в конце концовJDK почти из 15, даже 8 из "Lambda"Неужели не получится!!!
Приходите, приходите и посмотрите, как использоватьЛямбда-выражение + анонимный внутренний классОперация САО
/**
* Create By CodeCow on 2020/8/3.
*/
public class TestRunnableByLambda {
public static void main(String[] args) {
new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("新线程————看大片(别多想) :好刺激哟,不行了,快、快。。" + i);
}
}).start();
for (int i = 0; i < 5; i++) {
System.out.println("main线程————撸代码,没意思。。" + i);
}
}
}
Результаты очевидны ипоток кода" а также "смотреть тред блокбастеракаждый исполнял по пять раз Однако она тоже находится в актуальной разработке, не то что предыдущая статья«Обещай мне, если/иначе перестанешь проверять параметры запроса, хорошо?»Так просто.
То есть это не так просто, как 3+2 - 5*0
Если необходимо:Необходимо, чтобы асинхронно выполняющийся поток возвращал значение текущему потоку после завершения выполнения, и текущий поток должен полагаться на это значение для выполнения некоторых других бизнес-операций!
В это время, что делать! Не паникуйте,Приемлемые дебюты
Пять, Callable понять
Так же, позвольте мне показать вамИсходный код класса Callable
Видно, что интерфейс CallableJava1.5стали появляться иСуществует только один метод call() с возвращаемым значением.
Итак, вопрос в том, какнаписать поток с возвращаемым значением нажмите ?
Успокойся, смотри, как я выступаю
Сначала создайте класс TestCallable иРеализовать вызываемый интерфейс
/**
* Create By CodeCow on 2020/8/3.
*/
@Slf4j
public class TestCallable implements Callable<String> {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newCachedThreadPool();
TestCallable testCallable = new TestCallable();
Future<String> future = executorService.submit(testCallable);
log.info("future: " + future.get()); //get会阻塞
executorService.shutdown();
}
@Override
public String call() throws Exception {
return "带含有返回值的线程";
}
}
Далее мыЗапустить TestCallable, посмотреть результат
Connected to the target VM, address: '127.0.0.1:57004', transport: 'socket'
03:45:08.723 [main] INFO com.codecow.mini.test.TestCallable - future: 带含有返回值的线程
Disconnected from the target VM, address: '127.0.0.1:57004', transport: 'socket'
Нетрудно увидеть, что происходит. . . .
постскриптум
Ну, давайте сначала поговорим об этом здесь, эта статья толькоБросание кирпичей и привлечение нефритаВот и все, немного о реализации"Многопоточность" несколькими способами.
Во-вторых, если бы я видел подобную статью два года назад, и "Читайте больше книг, читайте больше газет, меньше хвастайтесь, больше спите», и не пройдет мимо «Сяо Ян».Почему! два года.
★★ Хорошая рекомендация статьи ★★
- Обещай мне, если/иначе перестанешь проверять параметры запроса, хорошо?
- Говоря о фильтре + перехватчике + JWT
- Оплата апплета WeChat + официальная оплата аккаунта (включая исходный код)
- Авторизация официальной учетной записи WeChat + получение информации о пользователе + вход в jwt (включая исходный код)
- Авторизация апплета WeChat + получение номера мобильного телефона пользователя + логин jwt (включая исходный код)
★★ Whisper BB ★★
- Китайская традиционная культура, сначала внимательно посмотрите, если это полезно, а затем лайкните или полюбите, дайте себе время подумать
- Если вы не понимаете, вы можете оставить комментарий или личное сообщение редактору, редактор ответит как можно скорее ^_^
- Больше юмористических, смешных и хороших статей, все в паблике "CodeCow·Program скот"
«Ява как море, научись строить лодку, сплавляйся по морю, только познай просторы Явы»