如果java中有任何线程失败,如何停止所有线程?
我有一个平面文件,比如一个50mb的csv文件,其中包含一个结构化数据,我需要读取它们,然后需要插入一个db,比如MySQL。一种方法是将文件拆分为多个文件,然后使用执行器并行处理。这是okie。现在是第二个用例,如果任何一个数据不正确,我需要停止处理所有线程,这意味着如果csv中发现的任何一个数据不正确,我们就不应该处理事务。我需要第二部分的想法 谢谢,如果java中有任何线程失败,如何停止所有线程?,java,multithreading,Java,Multithreading,我有一个平面文件,比如一个50mb的csv文件,其中包含一个结构化数据,我需要读取它们,然后需要插入一个db,比如MySQL。一种方法是将文件拆分为多个文件,然后使用执行器并行处理。这是okie。现在是第二个用例,如果任何一个数据不正确,我需要停止处理所有线程,这意味着如果csv中发现的任何一个数据不正确,我们就不应该处理事务。我需要第二部分的想法 谢谢, RK一定要使用ThreadGroup public static void main(String... args) { final
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遍:
java.util.concurrent
包中使用类似于同步器或其他类型的同步器
还有很多框架可以让这些东西变得更容易,并处理错误案例和作业的可重用性。是这样一种工具,还有其他几种 你能做一些类似于
AtomicBoolean stillAlive
的事情,让他们共享,并定期检查吗?然后任何人都可以将其设置为false,其他线程很快就会读到它,并知道停止。50mb似乎是小的一面。很惊讶你会因为这个而弄乱线程。MySQL不能在不使用jdbc的情况下读取csv吗。