使用线程同时运行两个独立任务

我已经在java中学习了许多关于线程的教程,但我无法找到答案。

我的问题是:如何同时运行两个独立的线程?

我的情况是:我有两个任务;

  1. 将一些数据保存到数据库中
  2. 在移动设备上发送推送通知。

由于这两个任务是独立的,我想同时执行它们。

我尝试使用具有两个线程的线程池,但问题是数据库任务很快完成,但发送推送通知需要一些时间。

因此,当一个任务完成而另一个任务仍未决时,它会抛出exception。

我的代码也没有问题,因为它运行正常而不使用线程。

提前致谢

new Thread(new Runnable() { public void run() { System.out.println("Look ma, no hands"); } }).start(); new Thread(new Runnable() { public void run() { System.out.println("Look at me, look at me..."); } }).start(); 

工作得很好……

我更喜欢亲自使用ExecutorService 。

使用ExecutorService示例更新

所以我写了这个非常快的例子……

基本上它使用ExecutorService来运行几个简单的任务。 就目前而言,这两项任务将相互并行(同时)

 public static void main(String[] args) throws InterruptedException { ExecutorService service = Executors.newFixedThreadPool(2); service.submit(new PathScanner()); service.submit(new Counter()); service.shutdown(); service.awaitTermination(1, TimeUnit.DAYS); System.exit(0); } public static class PathScanner implements Callable { @Override public Object call() throws Exception { scan(new File("C:/"), 0); return null; } protected void scan(File path, int deepth) { if (deepth < 15) { System.out.println("Scanning " + path + " at a deepth of " + deepth); File[] files = path.listFiles(); for (File file : files) { if (file.isDirectory()) { scan(file, ++deepth); } } } } } public static class Counter implements Callable { @Override public Object call() throws Exception { for (int index = 0; index < 1000; index++) { Thread.sleep(1); System.out.println(index); } return null; } } 

运行...

现在更改ExecutorService service = Executors.newFixedThreadPool(2); to ExecutorService service = Executors.newFixedThreadPool(1); 并再次运行它。 你看到了区别吗?

这是控制执行程序在处理队列时可以使用的同时线程数的方法。

组成更多任务并将它们添加到队列中,看看你得到了什么。

我有一个用例来使用multithreading搜索多个文件夹中的文件。 作为输入,我只有根目录路径,并且可以有任意数量的子目录。 假设 – 文件将始终仅在其中一个子目录中可用。

 import java.io.File; import java.io.FileFilter; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class SearchFile implements Runnable { private String dirPath = null; public SearchFile() { } public SearchFile(String dirPath) { this.dirPath = dirPath; } public static void main(String[] args) { long startTime = System.currentTimeMillis(); File dir = new File("D://"); checkRootDirectory(dir); long endTime = System.currentTimeMillis(); System.out.println("Time taken: "+(endTime - startTime) + "ms"); } private static void checkRootDirectory(File root) { File[] list = root.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.isDirectory() && !pathname.isHidden(); } }); ExecutorService service = Executors.newFixedThreadPool(list.length); for (File directories : list) { String dirPath = directories.getAbsolutePath(); Thread thread = new Thread(new SearchFile(dirPath)); service.execute(thread); } service.shutdown(); while(!service.isTerminated()) { } } @Override public void run() { checkEachDirectory(new File(dirPath), "Temp.txt"); } private void checkEachDirectory(File root, String fileName) { File[] list = root.listFiles(); if (null != list) { for (File dir : list) { if (dir.isDirectory()) { checkEachDirectory(dir, fileName); } else if (fileName.equalsIgnoreCase(dir.getName())) { System.out.println( "Thread name: " + Thread.currentThread().getName() + " Founded @" + dir.getAbsolutePath()); } } } } }