Так что я пытаюсь работать с потоками для игры, которую я делаю. Я очень новичок в теме, поэтому я могу не понимать правильно. Мой вопрос в том, как метод currentThread() работает в классе Thread API java. API говорит: «Возвращает ссылку на текущий исполняемый объект потока». Однако, насколько я понимаю, несколько потоков запускаются одновременно. Как можно вернуть только один исполняемый поток?Текущий метод потока java
ответ
Код, который вызывает currentThread
, будет выполняться в одном из потоков, а не во всех из них, поэтому он может получить эту тему.
Спасибо, что делает его намного яснее. – user1427380
Когда инструкция в вашем коде выполнена, она выполняется в определенном потоке. Это поток, возвращаемый этим методом.
Очевидно, что если конкретный метод выполняется несколькими потоками, каждое выполнение может возвращать другое значение для Thread.currentThread()
.
Вы можете попробовать этот короткий пример, чтобы лучше понять, что происходит, и, в частности, тот факт, что два потока выполняются параллельно. Вы должны увидеть, что t1 будет работать несколько цикла, то t2 будет делать то же самое и обратно t1 и т.д. (возможно, потребуется увеличить количество циклов от 5 до большего числа в зависимости от вашей машины):
public class TestThread {
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread());
}
}
};
Thread t1 = new Thread(r, "t1");
Thread t2 = new Thread(r, "t2");
t1.start();
t2.start();
}
}
Зачем вам нужно распечатывать текущий поток в цикле? Когда-то хватит, я бы подумал. – Jeffrey
Мне нравятся ваши первые 2 предложения ... но остальная часть сообщения, особенно код, кажется расплывчатым, чтобы ввести в заблуждение. – goat
@Jeffrey Идея состояла в том, чтобы показать некоторое перемежение, где один поток может запустить цикл дважды, затем другой активен и т. Д. – assylias
«Текущий исполняемый поток» означает, что системный планировщик дал некоторое время этому потоку для выполнения его кода.
Несколько потоков одновременно не работают и происходит переключение потоков между несколькими потоками. Процессор может выполнять одну задачу за раз, чтобы один поток за раз выполнялся. Таким образом, мы получаем ссылку на текущий поток.
Многоядерные машины действительно запускают несколько потоков одновременно. Я получил многопоточную программу (с высокоинтерактивными потоками), работающую на одноядерной машине, а затем переместил ее на машину с 4 ядрами. Это было настоящее образование. – RalphChapin
«Несколько потоков не выполняются одновременно» ... » – jdv
Предположим, у вас есть список инструкций, напечатанных на листе бумаги. Человек читает инструкции и выполняет их. Инструкции - это программа. Человек - это нить. Вы можете сделать много копий бумаги и передать их многим людям. Если инструкции говорят что-то вроде «пощечины», себя относится к тому, кто читает эту инструкцию из этой статьи. Аналогично, Thread.currentThread()
относится к потоку, который выполняет этот вызов до currentThread()
.
При написании однопоточного приложения вы можете использовать свою программу как последовательность команд, каждая из которых выполняется после завершения предыдущего (это приблизительное приближение, но концептуальный компилятор и процессор пытаются имитировать это и работать как если бы это было действительно то, что происходило).
Когда вы используете несколько потоков, каждый поток имеет свою собственную последовательность инструкций. Новый поток при создании передается точка входа (метод) и будет продолжать выполняться из них. Каждый поток не зависит от другого потока в их исполнении (он просто выполняет одну команду за другой), хотя они обмениваются памятью, и, таким образом, побочный эффект из одного потока может повлиять на другой.
Так что для некоторого кода, который должен быть выполнен, он должен выполняться в контексте одного потока (создается приложение, созданное операционной системой при запуске приложения, которое запускает его выполнение по методу Main
). Когда вызывается функция currentThread
, она находится в одном из этих контекстов.
java runtime при создании потока будет хранить ссылку на этот объект Thread
в контексте потока, а currentThread
будет просто искать там и возвращать текущий поток.
В любой момент времени будет выполняться только один поток (live), поэтому Thread.currentThread()
возвращает данные текущего исполняемого потока. например, Thread_name, priority, method_name.
- 1. Java Получить текущий экземпляр потока
- 2. Получить текущий исполняемый метод имя текущего потока
- 3. Метод потока метода JAVA
- 4. Как вызвать метод из определенного потока Java
- 5. Java reflection - метод вызова внутри потока
- 6. BufferedReader.readLine() метод блокирования потока
- 7. Получить текущий исполняемый метод
- 8. executeFetchRequest завершает текущий метод
- 9. Текущий метод определения местоположения
- 10. Как зарегистрировать текущий стек потока в журнале?
- 11. ASP.NET метод блокировки потока
- 12. Остановка потока на Java?
- 13. Как узнать, что метод java блокирует текущий поток
- 14. Игнорировать текущий метод на Log4Net
- 15. получить текущий класс и метод?
- 16. Текущий метод пользователя для Bigcommerce
- 17. Недопустимый заголовок потока Java
- 18. Прерывание потока в java
- 19. Java - Получить текущий общий класс
- 20. Ошибка Android Studio: «Метод getText() должен быть вызван из потока пользовательского интерфейса, текущий вывод - рабочий
- 21. Каков текущий метод подключения к серверу/клиенту
- 22. java таймер на текущий экземпляр
- 23. Прерывание потока в java
- 24. Java сериализации перезаписать текущий файл
- 25. Неверное изъятие Java-потока Java
- 26. Ошибка потока Java-потоков
- 27. Java порядок потока исполнения
- 28. Может ли заблокированный метод потока java выполняться другим потоком?
- 29. Есть ли метод потока Java, эквивалентный коллекциям Scala «собирать»?
- 30. Java Socket - как метод read() знает, достигнут ли конец потока?
вы должны прочитать несколько руководств по нарезке. – Sajmon
Я думаю, что они должны были назвать его getSelfThread() или что-то в этом роде, потому что может быть более одного исполняемого потока с многоядерным процессором. – goat