有没有人能以简单的方式提供一个解释Java Threads的示例程序?例如,假设我有三个帖子t1
,t2
和t3
。我想要一个代码来演示线程同时执行,而不是按顺序执行。
答案 0 :(得分:77)
这是一个简单的例子:
<强> 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等
现在,没有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
现在你可以看到每个线程都在执行,提前放弃控制,下一次执行。
答案 1 :(得分:8)
无论其他人发布的任何琐碎示例如何,都无法保证您的线程同时执行。如果您的操作系统仅为java进程提供一个处理器,那么您的Java线程仍将以循环方式为每个时间片安排。意思是,没有两个将同时执行,但他们所做的工作将是交错的。您可以使用Java的Visual VM(JDK中的标准)等监视工具来观察在Java进程中执行的线程。
答案 2 :(得分:4)
一个简单的例子:
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();
}
}
答案 3 :(得分:0)
创建java应用程序,在其中定义两个线程,即t1和t2,线程t1将生成随机数0和1(模拟投掷硬币)。 0表示头部,1表示尾部。另一个线程t2将执行相同的t1,t2将重复此循环100次,最后您的应用程序应确定t1猜测t2生成的数量然后显示分数的次数。例如,如果线程t1从100中猜出20个数字,则t1的得分为20/100 = 0.2如果t1猜测100个数字则得分为1,依此类推