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 - Fatal编程技术网

如果java中有任何线程失败,如何停止所有线程?

如果java中有任何线程失败,如何停止所有线程?,java,multithreading,Java,Multithreading,我有一个平面文件,比如一个50mb的csv文件,其中包含一个结构化数据,我需要读取它们,然后需要插入一个db,比如MySQL。一种方法是将文件拆分为多个文件,然后使用执行器并行处理。这是okie。现在是第二个用例,如果任何一个数据不正确,我需要停止处理所有线程,这意味着如果csv中发现的任何一个数据不正确,我们就不应该处理事务。我需要第二部分的想法 谢谢, RK一定要使用ThreadGroup public static void main(String... args) { final

我有一个平面文件,比如一个50mb的csv文件,其中包含一个结构化数据,我需要读取它们,然后需要插入一个db,比如MySQL。一种方法是将文件拆分为多个文件,然后使用执行器并行处理。这是okie。现在是第二个用例,如果任何一个数据不正确,我需要停止处理所有线程,这意味着如果csv中发现的任何一个数据不正确,我们就不应该处理事务。我需要第二部分的想法

谢谢,
RK

一定要使用
ThreadGroup

public static void main(String... args) {
    final ThreadGroup group = new ThreadGroup("Thread Group");

    new Thread(group, () -> {
        // payload
        group.interrupt();
    }).start();

    new Thread(group, () -> {
        // payload
        group.interrupt();
    }).start();
}

对于50MB,添加多个线程会使设计过于复杂。平面文件或结构化数据(如JSON)可以通过一个线程在几秒钟内完成,如果不是更快的话。为50MB的数据启动多个线程是过分的。在很多情况下,我使用单线程处理了400+MB JSON或CSV数据的相同用例

您还必须考虑到您正在编写一个DB,在这种情况下,多线程会使事务复杂化,因为您有多个事务。以CSV为例,听起来您希望每个线程负责读取一行或多行并将其写入DB?在这种情况下,每个线程都在自己的JDBC事务中运行。因此,如果停止所有线程,最终将在数据库中写入部分数据,因为某些线程可能已经完成了工作,并导致完成了事务。由于每个线程都是独立运行的,因此您没有机会回滚已完成线程的所有已提交事务

如果你仍然致力于50MB的数据并行化,考虑2遍:

  • 读取和验证数据并生成适当的SQL insert语句
  • 如果所有线程都成功,则执行生成的SQL文件
  • 这将满足您的需要,并且您可以保证在将任何数据写入数据库之前,如果出现验证错误,您将完全归档。其次,它确保数据可以原子地写入数据库。要想做您想做的事情,您需要在
    java.util.concurrent
    包中使用类似于同步器或其他类型的同步器


    还有很多框架可以让这些东西变得更容易,并处理错误案例和作业的可重用性。是这样一种工具,还有其他几种

    你能做一些类似于
    AtomicBoolean stillAlive
    的事情,让他们共享,并定期检查吗?然后任何人都可以将其设置为false,其他线程很快就会读到它,并知道停止。50mb似乎是小的一面。很惊讶你会因为这个而弄乱线程。MySQL不能在不使用jdbc的情况下读取csv吗。