我一直在尝试编写一些java应用程序。 这个应用程序想要运行的是处理文本文件。
但是,输入文本文件很大,(超过200mb) 我试图将200mb分成四个分割文件(每个50mb)
然后,使用四个线程,尝试同时处理每个分割。
所以,我创建了一个实现runnable的类,它有一个文本处理模块。 然后,我制作4个obj(名为worker1~workman4)runnnable类,然后调用:
worker1.run();
worker2.run();
worker3.run();
worker4.run();
但是,这些线程不是同时运行,而是线性运行。 这意味着,在完成worker 1线程之后,worker2线程正在运行。
所以,他们每个只需要0.5秒,但是通过这种线性运行,每次花费2秒。 (worker1为0.5s + worker2为0.5s + worker3为0.5s + worker4为0.5s) 如果我可以同时运行4个线程,我预计这个应用程序只需要0.5秒或不到1秒,这比2秒快。
我该怎么做?
答案 0 :(得分:3)
你需要开始一个线程。所以:
new Thread(worker1).start();
new Thread(worker2).start();
new Thread(worker3).start();
new Thread(worker4).start();
答案 1 :(得分:1)
Runnable对象不是Thread,你需要使用Thread来运行Runnable Object,如下所示:
new Thread(worker1).start();
但我认为你可能会面临其他问题,所以请阅读java文档。
答案 2 :(得分:1)
读取一个磁盘上的文件通常不会受益于多线程。
尝试改进阅读和处理文件的方式。如果您还没有使用缓冲区,请使用BufferedReader
。
如果你从读取的内容中做了很多处理,那么考虑多线程处理,同时保持一个线程专用于读取。
要运行并发任务,您应该使用ExecutorService
来实现Executors
。花些时间阅读javadoc。
答案 3 :(得分:0)
worker1.run();
直接调用您的run方法。要启动一个线程(在新线程中调用run方法),请使用:
worker1.start();
(类似于worker2 / 3/4)
编辑:我认为工人是线程,而不是Runnables。 mvieghofer的回答是正确的。