多线程 运行 同时处理

multi-thread run processes simultaneously

我目前有兴趣学习多线程。我写了一段代码。我的问题是这是否是正确的方法。我稍后想在我的另一个代码中实现它。我的想法是 运行 存在相同 class 的多个线程。所以假设有 5 个线程,它们内部都有一个 运行ner class。我想在另一个代码中实现的是,我想同时 运行 多个浏览器。所以,我有一个 class 浏览器。然后我有 5 个线程与 class 浏览器。而且他们都在同时工作但彼此不认识,所以他们之间根本没有任何互动。

那么这个想法可以吗?

class Runner implements Runnable {
public void run() {
    for(int i = 0; i < 10; i++) {
        System.out.println(Thread.currentThread().getName() + " - " + i);

        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
}


public class BasisDemo {
    public static void main(String[] args) {
        Thread runner1 = new Thread(new Runner(), "Runner 1");
        runner1.start();

        Thread runner2 = new Thread(new Runner(), "Runner 2");
        runner2.start();
    }

}

这是一个好的做法吗?它支持我的想法吗?

或者甚至不需要使用多线程。 我不太清楚。

谢谢你帮我。

听起来你走对了路。每个线程都不会相互引用,因为您将它们定义为单独的对象。他们都能够包含自己的数据,执行自己的方法,完全独立于彼此。

您可以确认它们同时执行的一种方法是让您的循环从一个随机数开始,这样您将看到控制台输出从两个不同的数字开始递增。 (即 100、50、101、102、51、52,...)

您所概述的是在 Java 中创建线程的最常用方法,您可以阅读更多相关内容 here 如果您稍后有问题。

所以你的想法会奏效。如果您尝试下面的代码。

System.out.println(System.currentTimeMillis());
System.out.println(System.currentTimeMillis());

你会发现时间其实是一样的,也就是说这两行几乎是同时执行的

根据您的代码:

Thread runner1 = new Thread(new Runner(), "Runner 1");
runner1.start();

Thread runner2 = new Thread(new Runner(), "Runner 2");
runner2.start();

这些线程几乎同时执行,这就是为什么你的想法会奏效。

为了更准确。您可以切换代码:

Thread runner1 = new Thread(new Runner(), "Runner 1");
Thread runner2 = new Thread(new Runner(), "Runner 2");
runner1.start();
runner2.start();

如果你想让时间更准确。您可以使用 CyclicBarrier。它允许一组线程相互等待并同时启动。这是演示代码:

class Demo {
   final CyclicBarrier barrier;

   class Broswer implements Runnable {
     Worker() { }
     public void run() {
       while (!done()) {
         try {
           // wait for other threads
           barrier.await();
           // work for something, in your case an hour, but how can you control that
           // work....
           // sleep for a certain time
           sleep(certain time)
         } catch (InterruptedException ex) {
           return;
         } catch (BrokenBarrierException ex) {
           return;
         }
       }
     }
   }

   public static main(String args[]) {
     barrier = new CyclicBarrier(N);
     for (int i = 0; i < N; ++i)
       new Thread(new Broswer()).start();

     // wait until all done, in your case, forever.
   }
 }

1 个线程,而不是 5 个

Or is using multi-threading even unnecessary. I don't know it for sure.

如果使用相同的 class 来完成相同的工作,则不需要 5 个线程。您每天只需要一个线程即可在后台 运行 一项任务。

如果你每天都想要一份日报,你会派其中一个 children 每天早上手里拿着一美元去商店吗?发送 5 的 children 每人手头一美元?

ScheduledExecutorService

此外,Java 为此类工作提供了一个灵活的工具,您可以在其中定期安排要在后台完成的任务:ScheduledExecutorService。搜索 Stack Overflow 了解更多信息,并阅读 Oracle 执行器教程。