【问题标题】:Java Thread Example? [closed]Java线程示例? [关闭]
【发布时间】:2011-02-01 16:21:32
【问题描述】:

谁能给出一个以简单方式解释 Java 线程的示例程序?例如,假设我有三个线程t1t2t3。我想要一个代码来演示线程同时执行,而不是顺序执行。

【问题讨论】:

  • 那么您的问题到底是什么?现在听起来就像“给我代码”,我们不这样做......更不用说,即使在那种情况下,我也不确定你想要的这段代码到底应该做什么。
  • 我一直很喜欢这个minimal reproducible example[1],它允许多个线程共享控制台。 [1]:groups.google.com/group/comp.lang.java.programmer/msg/…
  • 通过实例 David 了解并发编程。
  • 我把你的问题理解为你想要一个例子来证明线程按照他们所说的做,在视觉上。我希望我的回答能有所帮助,尽管每个线程的输出都不实用。

标签: java multithreading


【解决方案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 等。

现在,在没有 IO 的情况下,像这样的微不足道的计算仍然看起来就像线程在按顺序执行一样,这就是为什么我只展示了输出的第一部分。在我的电脑上,在这个 ID 为 10 的输出线程一次性完成后,接着是 9,然后是 8。如果你输入一个等待或一个 yield,你会看得更清楚:

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

现在您可以看到每个线程正在执行、提前放弃控制以及下一次执行。

【讨论】:

  • Thx Phil ..非常好的答案,我完全期望。
  • 解释得很漂亮。如此多的 Java 开发人员对线程的顺序执行与并行执行感到困惑。这会帮助他们。
【解决方案2】:

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

【讨论】:

  • 蒂姆,这似乎是一个真正的问题。 OP 说他只是想要一个实际的例子(确保 OP 可以用谷歌搜索它,但这不一定是一个无效的问题)。
  • 我想我的意思是,从不适合问答格式的意义上说,这并不是一个真正的问题。相反,它要求提供示例代码。无论如何,它很粗糙,所以我编辑了我的答案,这在技术上仍然是正确的。没有办法明确地证明同时执行。即使是公认的答案也只能证明交错。
【解决方案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 表示头部,1 表示尾部。另一个线程 t2 将执行相同的 t1 和 t2 将重复此循环 100 次,最后您的应用程序应确定 t1 猜测 t2 生成的数字的次数,然后显示分数。例如,如果线程 t1 从 100 中猜出 20 个数字,那么 t1 的得分是 20/100 =0.2 如果 t1 猜到 100 个数字,那么它的得分为 1,依此类推

    【讨论】:

      猜你喜欢
      • 2010-11-01
      • 2020-09-20
      • 2012-12-04
      • 2013-11-04
      • 2017-11-05
      • 2013-04-18
      • 1970-01-01
      • 2016-07-18
      相关资源
      最近更新 更多