我目前有兴趣了解多线程。我写了一段代码。我的问题是,这是否正确。我后来想在我的另一个代码中实现它。我的想法是运行同一类的多个线程。所以让我们说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();
}
}
这是一个很好的做法,它是否支持我的想法?
或者使用多线程甚至是不必要的。 我肯定不知道。
感谢您帮助我。
答案 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)
或者使用多线程甚至是不必要的。我肯定不知道。
如果使用相同的类来完成相同的工作,那么不,不需要5个线程。您只需要一个线程即可在后台每天运行任务。
如果你想每天复印一份日报,你会每天早上用一美元将一个你的孩子送到商店,或者你会发送五个你的孩子手里拿着一美元?
ScheduledExecutorService
此外,Java为这类工作提供了一个灵活的工具,您可以在这里安排要在后台定期完成的任务:ScheduledExecutorService
。搜索Stack Overflow以获取更多信息,并阅读关于执行者的Oracle教程。