Пример Java Thread?

Может ли кто-нибудь дать примерную программу, которая объясняет Java Threads простым способом? Например, скажем, у меня три потока t1, t2 и t3. Мне нужен код, который демонстрирует, что потоки выполняются одновременно, а не последовательно.

Ответ 1

Вот простой пример:

ThreadTest.java

public class ThreadTest
{
   public static void main(String [] args)
   {
      MyThread t1 = new MyThread(0, 3, 300);
      MyThread t2 = new MyThread(1, 3, 300);
      MyThread t3 = new MyThread(2, 3, 300);

      t1.start();
      t2.start();
      t3.start();
   }
}

MyThread.java

public class MyThread extends Thread
{
   private int startIdx, nThreads, maxIdx;

   public MyThread(int s, int n, int m)
   {
      this.startIdx = s;
      this.nThreads = n;
      this.maxIdx = m;
   }

   @Override
   public void run()
   {
      for(int i = this.startIdx; i < this.maxIdx; i += this.nThreads)
      {
         System.out.println("[ID " + this.getId() + "] " + i);
      }
   }
}

И некоторый вывод:

[ID 9] 1
[ID 10] 2
[ID 8] 0
[ID 10] 5
[ID 9] 4
[ID 10] 8
[ID 8] 3
[ID 10] 11
[ID 10] 14
[ID 10] 17
[ID 10] 20
[ID 10] 23

Объяснение. Каждый объект MyThread пытается напечатать числа от 0 до 300, но они отвечают только за определенные области этого диапазона. Я решил разбить его по индексам, причем каждый поток прыгал вперед по количеству потоков. Итак, t1 имеет индекс 0, 3, 6, 9 и т.д.

Теперь, без ввода-вывода, тривиальные вычисления, подобные этому, могут по-прежнему выглядеть так, как потоки выполняются последовательно, поэтому я просто показал первую часть вывода. На моем компьютере после этого выходной поток с идентификатором 10 заканчивается сразу, а затем 9, затем 8. Если вы положили ожидание или доходность, вы можете увидеть его лучше:

MyThread.java

System.out.println("[ID " + this.getId() + "] " + i);
Thread.yield();

И вывод:

[ID 8] 0
[ID 9] 1
[ID 10] 2
[ID 8] 3
[ID 9] 4
[ID 8] 6
[ID 10] 5
[ID 9] 7

Теперь вы можете увидеть выполнение каждого потока, отказаться от управления на ранней стадии и следующего выполнения.

Ответ 2

Нет никакой гарантии, что ваши потоки выполняются одновременно, независимо от любого тривиального примера. Если ваша ОС только дает процессу java один процессор для работы, ваши потоки java будут по-прежнему планироваться для каждого временного фрагмента в циклическом режиме. Значит, ни один из двух не будет выполняться одновременно, но работа, которую они выполняют, будет чередоваться. Вы можете использовать инструменты мониторинга, такие как Java Visual VM (стандарт в JDK), чтобы наблюдать за потоками, выполняемыми в процессе Java.

Ответ 3

Простой пример:

public class Test extends Thread {
    public synchronized void run() {
        for (int i = 0; i <= 10; i++) {
            System.out.println("i::"+i);
        }
    }

    public static void main(String[] args) {
        Test obj = new Test();

        Thread t1 = new Thread(obj);
        Thread t2 = new Thread(obj);
        Thread t3 = new Thread(obj);

        t1.start();
        t2.start();
        t3.start();
    }
}

Ответ 4

создайте приложение java, в котором вы определяете два потока, а именно t1 и t2, поток t1 будет генерировать случайные числа 0 и 1 (имитировать бросок монеты). 0 означает головку и один хвост средства. другой поток t2 будет делать то же самое t1 и t2 будет повторять этот цикл 100 раз, и, наконец, ваше приложение должно определить, сколько раз t1 угадывает число, сгенерированное t2, а затем отображает счет. например, если поток t1 угадывает 20 номеров из 100, тогда оценка t1 равна 20/100 = 0,2, если t1 догадывается о 100 числах, тогда он получает оценку 1 и т.д.