Latest web development tutorials

Java многопоточного программирования

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

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

Другой термин определен здесь, и нити, связанные - процесс: процесс включая операционную систему выделяет пространство памяти, которая содержит один или несколько потоков. Отдельный поток не может существовать, она должна быть частью процесса. Процесс не был запущен до конца все не ждать, пока после того, как конец нити, чтобы бежать.

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


Жизненный цикл потока

Тема на всех этапах его жизненного цикла. На приведенном ниже рисунке показан полный жизненный цикл потока.

java_thread

  • Новый статус:

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

  • Состояние готовности:

    Когда объект потока для вызова метода Start (), то поток в состояние готовности. Готовая нить в очередь готовых, чтобы ждать планирования планировщика виртуальной машины Java потоков.

  • Рабочее состояние:

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

  • Заблокированные состояние:

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

  • Состояние смерти:

    Когда происходит красной нитью проходит состояние задачи или другое условие завершения, поток переключается в конечное состояние.


приоритет нити

Каждый Java поток имеет приоритет, который помогает определить порядок планирования потоков операционной системы.

приоритетом для Java-потока представляет собой целое число, которое находится в диапазоне от 1 (Thread.MIN_PRIORITY) - 10 (Thread.MAX_PRIORITY).

По умолчанию, каждый поток назначается приоритет NORM_PRIORITY (5).

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


Создание потока

Java предоставляет два метода для создания потока:

  • Runable путем реализации интерфейса;
  • Через самого наследования класса Thread.

Для создания потока за счет реализации Runnable интерфейс

Создайте нить, самый простой способ создать класс, который реализует интерфейс Runnable.

Для достижения Runnable, класс нужно только выполнить прогон вызова метода (), следующее заявление:

public void run()

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

После создания класса реализует Runnable интерфейс, вы можете создать экземпляр объекта в классе нить.

Автор определяет несколько конструкторов, которые вслед за этим мы часто используем:

Thread(Runnable threadOb,String threadName);

Здесь threadOb является экземпляром класса, который реализует интерфейс Runnable, и threadName указать новое имя потока.

После того, как новый поток создается, вы вызовите метод Start () он будет работать.

void start();

примеров

Вот пример этого, чтобы создать поток и начать выполнение:

// 创建一个新的线程
class NewThread implements Runnable {
   Thread t;
   NewThread() {
      // 创建第二个新线程
      t = new Thread(this, "Demo Thread");
      System.out.println("Child thread: " + t);
      t.start(); // 开始线程
   }
  
   // 第二个线程入口
   public void run() {
      try {
         for(int i = 5; i > 0; i--) {
            System.out.println("Child Thread: " + i);
            // 暂停线程
            Thread.sleep(50);
         }
     } catch (InterruptedException e) {
         System.out.println("Child interrupted.");
     }
     System.out.println("Exiting child thread.");
   }
}
 
public class ThreadDemo {
   public static void main(String args[]) {
      new NewThread(); // 创建一个新线程
      try {
         for(int i = 5; i > 0; i--) {
           System.out.println("Main Thread: " + i);
           Thread.sleep(100);
         }
      } catch (InterruptedException e) {
         System.out.println("Main thread interrupted.");
      }
      System.out.println("Main thread exiting.");
   }
}

Компиляция выше программа работает следующим образом:

Child thread: Thread[Demo Thread,5,main]
Main Thread: 5
Child Thread: 5
Child Thread: 4
Main Thread: 4
Child Thread: 3
Child Thread: 2
Main Thread: 3
Child Thread: 1
Exiting child thread.
Main Thread: 2
Main Thread: 1
Main thread exiting.

Для того, чтобы создать поток через наследование тему

Второй способ создать поток, чтобы создать новый класс, который наследует класс Thread, а затем создать экземпляр класса.

Наследование класс должен переопределить метод Run (), который является отправной точкой для нового потока. Он также должен вызвать метод запуска () для выполнения.

примеров

// 通过继承 Thread 创建线程
class NewThread extends Thread {
   NewThread() {
      // 创建第二个新线程
      super("Demo Thread");
      System.out.println("Child thread: " + this);
      start(); // 开始线程
   }
 
   // 第二个线程入口
   public void run() {
      try {
         for(int i = 5; i > 0; i--) {
            System.out.println("Child Thread: " + i);
                            // 让线程休眠一会
            Thread.sleep(50);
         }
      } catch (InterruptedException e) {
         System.out.println("Child interrupted.");
      }
      System.out.println("Exiting child thread.");
   }
}
 
public class ExtendThread {
   public static void main(String args[]) {
      new NewThread(); // 创建一个新线程
      try {
         for(int i = 5; i > 0; i--) {
            System.out.println("Main Thread: " + i);
            Thread.sleep(100);
         }
      } catch (InterruptedException e) {
         System.out.println("Main thread interrupted.");
      }
      System.out.println("Main thread exiting.");
   }
}

Компиляция выше программа работает следующим образом:

Child thread: Thread[Demo Thread,5,main]
Main Thread: 5
Child Thread: 5
Child Thread: 4
Main Thread: 4
Child Thread: 3
Child Thread: 2
Main Thread: 3
Child Thread: 1
Exiting child thread.
Main Thread: 2
Main Thread: 1
Main thread exiting.

Методы темы

В следующей таблице перечислены класс Thread некоторые важные способы:

Нет . Метод Описание
1 общественного недействительными старт ()
Сделать эту тему , чтобы начать выполнение; виртуальная машина Java вызывает метод запуска этого потока.
2 общественного недействительными запуска ()
Если эта нить была построена с использованием отдельного объекта Runnable запуска, а затем вызвать метод пробеге Runnable объекта, в противном случае, этот метод не делает ничего и возвращает.
3 общественное окончательное недействительным SetName (имя String)
Изменение имени этой нити, так что же имя параметра.
4 общественное окончательное недействительным SetPriority (INT приоритет)
Изменение приоритета потоков.
5 общественности окончательным недействительным setDaemon (булева на)
Отмечает эту нить как демон нить или нити пользователя.
6 общественности окончательное недействительным присоединиться (длинный Миллисек)
Подождите, пока эту тему до максимум Миллис миллисекунд.
7 общественного недействительными прерывания ()
Прерванный нить.
8 общественное окончательное логическое IsAlive ()
Тесты, если этот поток активен.

Тесты, если этот поток активен. Описанный выше метод называется объектом резьбы. Следующий метод является статическим методом класса Thread.

Нет . Метод Описание
1 государственной статической силы доходности ()
Приостановить исполняемую в данный момент объект потока, а также выполнять другие темы.
2 государственной статической силы сна (длинные Миллисек)
В течение указанного количества миллисекунд в настоящее время выполняющийся поток спать (исполнение прекращения), эта операционная система таймеров и планировщиков по точности и точности.
3 общественности статической булевых holdsLock (Object х)
Если и только если текущий поток удерживает блокировку монитора на указанном объекте, он возвращает истину.
4 общественности статической резьбы currentThread ()
Он возвращает ссылку на исполняемой в данный момент объект потока.
5 государственной статической силы dumpStack ()
трассировки стека печатает текущего потока в стандартный поток ошибок.

примеров

Следующая программа демонстрирует некоторые из способов ThreadClassDemo класса темы:

// 文件名 : DisplayMessage.java
// 通过实现 Runnable 接口创建线程
public class DisplayMessage implements Runnable
{
   private String message;
   public DisplayMessage(String message)
   {
      this.message = message;
   }
   public void run()
   {
      while(true)
      {
         System.out.println(message);
      }
   }
}
// 文件名 : GuessANumber.java
// 通过继承 Thread 类创建线程

public class GuessANumber extends Thread
{
   private int number;
   public GuessANumber(int number)
   {
      this.number = number;
   }
   public void run()
   {
      int counter = 0;
      int guess = 0;
      do
      {
          guess = (int) (Math.random() * 100 + 1);
          System.out.println(this.getName()
                       + " guesses " + guess);
          counter++;
      }while(guess != number);
      System.out.println("** Correct! " + this.getName()
                       + " in " + counter + " guesses.**");
   }
}
// 文件名 : ThreadClassDemo.java
public class ThreadClassDemo
{
   public static void main(String [] args)
   {
      Runnable hello = new DisplayMessage("Hello");
      Thread thread1 = new Thread(hello);
      thread1.setDaemon(true);
      thread1.setName("hello");
      System.out.println("Starting hello thread...");
      thread1.start();
     
      Runnable bye = new DisplayMessage("Goodbye");
      Thread thread2 = new Thread(bye);
      thread2.setPriority(Thread.MIN_PRIORITY);
      thread2.setDaemon(true);
      System.out.println("Starting goodbye thread...");
      thread2.start();
 
      System.out.println("Starting thread3...");
      Thread thread3 = new GuessANumber(27);
      thread3.start();
      try
      {
         thread3.join();
      }catch(InterruptedException e)
      {
         System.out.println("Thread interrupted.");
      }
      System.out.println("Starting thread4...");
      Thread thread4 = new GuessANumber(75);
     
           thread4.start();
      System.out.println("main() is ending...");
   }
}

Результаты таковы, результаты каждого прогона не одинаковы.

Starting hello thread...
Starting goodbye thread...
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Thread-2 guesses 27
Hello
** Correct! Thread-2 in 102 guesses.**
Hello
Starting thread4...
Hello
Hello
..........remaining result produced.

Автор несколько основных концепций:

При многопоточного программирования, вы должны понимать следующие понятия:

  • Синхронизация потоков
  • Связь между потоками
  • тупиковый резьбы
  • Контроль резьбы: Приостановить, стоп и резюме

Использование нескольких потоков

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

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

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