Может ли кто-нибудь дать примерную программу, которая объясняет Java Threads простым способом? Например, скажем, у меня три потока t1
, t2
и t3
. Мне нужен код, который демонстрирует, что потоки выполняются одновременно, а не последовательно.
Пример Java Thread?
Ответ 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 и т.д.