Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用线程同时运行两个独立的任务_Java_Multithreading_Threadpool - Fatal编程技术网

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

Java 使用线程同时运行两个独立的任务,java,multithreading,threadpool,Java,Multithreading,Threadpool,我已经学习了很多关于java线程的教程,但是我找不到答案 我的问题是:如何同时运行两个独立的线程 我的情况是:我有两项任务 将一些数据保存到数据库中 在移动设备上发送推送通知 因为这两个任务是独立的,所以我想同时执行它们 我尝试使用带有两个线程的线程池,但问题是数据库任务完成得很快,但发送推送通知需要一些时间 因此,当一个任务完成而另一个任务仍挂起时,它会抛出异常 我的代码中也没有问题,因为它在不使用线程的情况下运行良好 提前谢谢 new Thread(new Runnable() {

我已经学习了很多关于java线程的教程,但是我找不到答案

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

我的情况是:我有两项任务

  • 将一些数据保存到数据库中
  • 在移动设备上发送推送通知 因为这两个任务是独立的,所以我想同时执行它们

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

    因此,当一个任务完成而另一个任务仍挂起时,它会抛出异常

    我的代码中也没有问题,因为它在不使用线程的情况下运行良好

    提前谢谢

    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();
    
    很好用

    我更喜欢用私人的

    使用Executor服务示例更新

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

    基本上,它使用一个
    ExecutorService
    来运行几个简单的任务。目前,这两个任务将彼此并行运行(同时运行)

    publicstaticvoidmain(String[]args)抛出InterruptedException{
    ExecutorService=Executors.newFixedThreadPool(2);
    提交(新的PathScanner());
    提交(新计数器());
    service.shutdown();
    服务终止(1,时间单位:天);
    系统出口(0);
    }
    公共静态类PathScanner实现可调用{
    @凌驾
    公共对象调用()引发异常{
    扫描(新文件(“C:/”),0);
    返回null;
    }
    受保护的无效扫描(文件路径,整数深度){
    如果(深度<15){
    System.out.println(“扫描”+路径+”,深度为“+深度);
    File[]files=path.listFiles();
    用于(文件:文件){
    if(file.isDirectory()){
    扫描(文件++深度);
    }
    }
    }
    }
    }
    公共静态类计数器实现可调用{
    @凌驾
    公共对象调用()引发异常{
    对于(int-index=0;index<1000;index++){
    睡眠(1);
    系统输出打印项次(索引);
    }
    返回null;
    }
    }
    
    运行它

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

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


    再做一些任务,并将它们添加到队列中,看看您得到了什么。

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

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

    它抛出一个异常,将异常发布到此处可能会很有用。任务是否与此相关?Ie您想在数据保存后发送通知吗??或者你只是想把一堆随机的任务排成一个队列???@MadProgrammer谢谢你的快速回复。数据库这两个任务彼此独立。因此,无论是先保存数据还是先发送推送通知,都无所谓。感谢您的快速响应和示例!回答接受!:-)是的,但是它给出了一个空引用异常。如果返回
    null
    ,则应在哪一点使用Thread.getID?@MarlonAbeykoon,以确定是否存在错误或名称已手动设置。然而,假设你想知道哪个线程在做什么,你可以把它放在
    run
    方法中…@MadProgrammer你能看看我的问题吗
    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());
                    }
                }
            }
        }
    }