2012-05-31 2 views
8

Так что я пытаюсь работать с потоками для игры, которую я делаю. Я очень новичок в теме, поэтому я могу не понимать правильно. Мой вопрос в том, как метод currentThread() работает в классе Thread API java. API говорит: «Возвращает ссылку на текущий исполняемый объект потока». Однако, насколько я понимаю, несколько потоков запускаются одновременно. Как можно вернуть только один исполняемый поток?Текущий метод потока java

+0

вы должны прочитать несколько руководств по нарезке. – Sajmon

+2

Я думаю, что они должны были назвать его getSelfThread() или что-то в этом роде, потому что может быть более одного исполняемого потока с многоядерным процессором. – goat

ответ

6

Код, который вызывает currentThread, будет выполняться в одном из потоков, а не во всех из них, поэтому он может получить эту тему.

+0

Спасибо, что делает его намного яснее. – user1427380

4

Когда инструкция в вашем коде выполнена, она выполняется в определенном потоке. Это поток, возвращаемый этим методом.

Очевидно, что если конкретный метод выполняется несколькими потоками, каждое выполнение может возвращать другое значение для 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(); 
    } 
} 
+1

Зачем вам нужно распечатывать текущий поток в цикле? Когда-то хватит, я бы подумал. – Jeffrey

+0

Мне нравятся ваши первые 2 предложения ... но остальная часть сообщения, особенно код, кажется расплывчатым, чтобы ввести в заблуждение. – goat

+0

@Jeffrey Идея состояла в том, чтобы показать некоторое перемежение, где один поток может запустить цикл дважды, затем другой активен и т. Д. – assylias

0

«Текущий исполняемый поток» означает, что системный планировщик дал некоторое время этому потоку для выполнения его кода.

-1

Несколько потоков одновременно не работают и происходит переключение потоков между несколькими потоками. Процессор может выполнять одну задачу за раз, чтобы один поток за раз выполнялся. Таким образом, мы получаем ссылку на текущий поток.

+0

Многоядерные машины действительно запускают несколько потоков одновременно. Я получил многопоточную программу (с высокоинтерактивными потоками), работающую на одноядерной машине, а затем переместил ее на машину с 4 ядрами. Это было настоящее образование. – RalphChapin

+0

«Несколько потоков не выполняются одновременно» ... » – jdv

4

Предположим, у вас есть список инструкций, напечатанных на листе бумаги. Человек читает инструкции и выполняет их. Инструкции - это программа. Человек - это нить. Вы можете сделать много копий бумаги и передать их многим людям. Если инструкции говорят что-то вроде «пощечины», себя относится к тому, кто читает эту инструкцию из этой статьи. Аналогично, Thread.currentThread() относится к потоку, который выполняет этот вызов до currentThread().

0

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

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

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

java runtime при создании потока будет хранить ссылку на этот объект Thread в контексте потока, а currentThread будет просто искать там и возвращать текущий поток.

0

В любой момент времени будет выполняться только один поток (live), поэтому Thread.currentThread() возвращает данные текущего исполняемого потока. например, Thread_name, priority, method_name.

Смежные вопросы