Java线程示例?
任何人都可以给一个简单的方法解释Java线程的示例程序? 例如,假设我有三个线程t1
, t2
和t3
。 我想要一个代码,演示线程同时执行,而不是顺序。
这是一个简单的例子:
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的数字,但它们只负责该范围的某些区域。 我select通过索引分割它,每个线程总数超前。 所以t1
索引是t1
等
现在,没有IO,像这样的微不足道的计算仍然可能看起来像线程顺序执行,这就是为什么我只显示了输出的第一部分。 在我的计算机上,这个ID为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
现在你可以看到每个执行的线程,放弃控制,然后执行。
不能保证你的线程正在同时执行,而不pipe任何其他人发布的任何微不足道的示例。 如果你的操作系统只给java进程一个处理器来处理,那么你的java线程仍然会以循环的方式为每个时间片调度。 意思是说,没有两个会同时执行,但是他们所做的工作是交错的。 您可以使用监视工具(如Java的Visual VM(JDK中的标准))来观察在Java进程中执行的线程。
一个简单的例子:
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(); } }
创buildjava应用程序,在其中定义两个线程即t1和t2,线程t1将生成随机数字0和1(模拟掷硬币)。 0表示头,一个表示尾巴。 另一个线程t2将执行相同的t1,并且t2将重复该循环100次,最后,您的应用程序应该确定t1猜测由t2产生的数字的次数,然后显示得分。 例如,如果线程t1猜出了20个数字中的100个,那么t1的得分为20/100 = 0.2,如果t1猜到了100个数字,那么得分为1,依此类推