1.34 Java线程示例?| Java Debug 笔记

193 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接

Debug 笔记 <Java线程示例?>

提问

谁能给出一个简单的示例程序来解释Java线程?

例如,假设我有三个线程t1t2t3

我想要一个代码来证明线程是同时执行的,而不是顺序执行的。

回答一

这是一个简单的示例:

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之间的数字,但它们仅负责该范围内的某些区域。

现在,在没有IO的情况下,像这样的琐碎计算仍然看起来像线程在按顺序执行,这就是为什么我只显示了输出的第一部分。

在我的计算机上,此ID10的输出线程一次全部完成,然后依次为98

如果您等待,则可以更好地看到它:

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

现在,您可以看到每个线程正在执行。

回答二

无论其他人发布任何琐碎的示例,都不能保证您的线程同时执行。

如果您的操作系统仅允许Java进程使用一个处理器,则仍将以循环方式为每个时间片安排Java线程。

意思是,没有两个人会同时执行,但是他们所做的工作将交织在一起。

您可以使用诸如JavaVisual VMJDK中的标准)之类的监视工具来观察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();
    }
}

文章翻译自Stack Overflow :stackoverflow.com/questions/2…