Java线程示例?

Jav*_*ser 46 java multithreading

有没有人能给出一个简单解释Java Threads的示例程序?例如,假设我有三个线程t1,t2并且t3.我想要一个代码来演示线程同时执行,而不是顺序执行.

Phi*_*hil 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();
   }
}
Run Code Online (Sandbox Code Playgroud)

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);
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

还有一些输出:

[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
Run Code Online (Sandbox Code Playgroud)

解释 - 每个MyThread对象尝试打印0到300之间的数字,但它们只负责该范围的某些区域.我选择按索引拆分它,每个线程总数超过线程数.这样t1做索引0,3,6,9,等

现在,没有IO,像这样的琐碎计算仍然看起来像是顺序执行线程,这就是为什么我只显示输出的第一部分.在我的计算机上,在ID 10的输出线程一次完成后,接着是9,然后是8.如果你输入等待或收益,你可以更好地看到它:

MyThread.java

System.out.println("[ID " + this.getId() + "] " + i);
Thread.yield();
Run Code Online (Sandbox Code Playgroud)

并输出:

[ID 8] 0
[ID 9] 1
[ID 10] 2
[ID 8] 3
[ID 9] 4
[ID 8] 6
[ID 10] 5
[ID 9] 7
Run Code Online (Sandbox Code Playgroud)

现在你可以看到每个线程都在执行,提前放弃控制,然后执行下一个.


Tim*_*der 8

无论其他人发布的任何简单示例,都无法保证您的线程同时执行.如果您的操作系统仅为java进程提供一个处理器,那么您的Java线程仍将以循环方式为每个时间片安排.意思是,没有两个将同时执行,但他们所做的工作将是交错的.您可以使用Java的Visual VM(JDK中的标准)等监视工具来观察在Java进程中执行的线程.

  • 我认为我的意思是,它不是一个真正的问题,因为它不适合Q&A格式.相反,它要求提供示例代码.无论如何,它是磨蚀性的,所以我编辑了我的答案,这在技术上仍然是正确的.没有办法明确地证明同时执行.即使是接受的答案也只能说明交错. (4认同)