多线程同时运行进程

时间:2017-04-21 20:26:14

标签: java multithreading junit4

我目前有兴趣了解多线程。我写了一段代码。我的问题是,这是否正确。我后来想在我的另一个代码中实现它。我的想法是运行同一类的多个线程。所以让我们说5个线程,他们都在里面有一个跑步者类。我想在另一个代码中实现的是,我希望一次运行多个浏览器。所以,我有一个类浏览器。然后我有类浏览器的5个线程。他们都在同时工作,但彼此不认识,所以他们根本没有任何互动。

那么这个想法好吗?

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();
    }

}

这是一个很好的做法,它是否支持我的想法?

或者使用多线程甚至是不必要的。 我肯定不知道。

感谢您帮助我。

3 个答案:

答案 0 :(得分:1)

所以你的想法会起作用。如果您在下面尝试此代码。

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 :(得分:0)

听起来你走在正确的轨道上。每个线程都没有彼此的引用,因为您将它们定义为单独的对象。他们都能够包含自己的数据,执行自己的方法,彼此完全独立。

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

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

答案 2 :(得分:0)

1个主题,而不是5个

  

或者使用多线程甚至是不必要的。我肯定不知道。

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

如果你想每天复印一份日报,你会每天早上用一美元将一个你的孩子送到商店,或者你会发送五个你的孩子手里拿着一美元?

ScheduledExecutorService

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