多线程同步时其中一个线程出异常其它线程会不会继续执行?

时间:2022-01-13 00:44:26
多线程同步时其中一个线程出异常其它线程会不会继续执行?

7 个解决方案

#1


线程代码中产生异常的话,那么这个线程的生命周期就结束了,这种情况称为线程泄漏。

注意,只是这个线程的生命结束了,但其他的线程还是活着的。如果是代码有 BUG,那其他线程走到这一块估计也会挂掉的。

#2


引用 1 楼 bao110908 的回复:
线程代码中产生异常的话,那么这个线程的生命周期就结束了,这种情况称为线程泄漏。

注意,只是这个线程的生命结束了,但其他的线程还是活着的。如果是代码有 BUG,那其他线程走到这一块估计也会挂掉的。

 +1

#3


会继续执行

package test;


public class ExceptionInThread extends Thread{

Integer id;
ExceptionInThread(Integer id){
this.id = id;
}
/**
 * @param args
 */
synchronized void go(){
System.out.println("id is " + id);
throw new java.lang.NullPointerException();
}

public void run(){
// Bean b = new Bean();
// b.go(1);
this.go();
}

public static void main(String[] args) {
// TODO Auto-generated method stub
Thread ct = new ExceptionInThread(1);
Thread ct2 = new ExceptionInThread(2);
ct.start();
ct2.start();
}

}

#4


线程与线程之间除非你刻意安排,否则是无关的。也就是说,线程A里有了异常并不会影响线程B。

如果对于线程这些东西并不熟悉,而又想要做好并发处理的代码,可以考虑用我做的一些开源的工具类: http://jabb.sourceforge.net/javadoc/net/sf/jabb/util/thread/package-summary.html,文档可看这个PDF的最后一部分: http://jabb.sourceforge.net/doc/jabb_intro.pdf

这些类构成了一个小型的框架,能够简化多线程并行数据处理的程序开发。用起来很简单,只要这样:
1. 创建你自己的处理实现类,继承QueueProcessor或者QueueBatchUniqueProcessor,实现其中的process()方法。
2. 用BlockingQueue的实例来存放待处理的数据
3. 对于你自己的处理实现类,创建足够多的实例。每个实例都会有一个对应的工作线程在需要的时候被创
建。
4. 创建一个QueueConsumerGroup的实例来管理和控制整个多线程数据处理过程。

QueueProcessor适合于需要对数据进行一个一个地处理的场合。
QueueBatchUniqueProcessor适合于需要对数据进行分批处理的场合。而且它能够在每批中去除掉重复的数据。

#5


如果其他线程没有wait,或者wait中但不依赖这个挂掉的线程notify,那么会其他线程不会停止。如果线程挂掉是因为代码的问题,那么执行相同的代码的线程执行代码时也会挂掉。

#6


java线程synchronized同步一定要实现Theard线程或实现Runable接口 后再调用么?

#7


LZ要区分synchronized和线程
继承Theard类或实现Runable接口,是为了使用线程
而synchronized是为了让线程同步,意思不一样的
也就是说你用不用Thread或Runable,都可以使用synchronized,即你用不用多线程,都可以使用syncronized来修饰你的方法,以保证线程安全,并不是说使用synchronized就一定要继承Thread或实现Runnable,要区分这些不同的概念。

#1


线程代码中产生异常的话,那么这个线程的生命周期就结束了,这种情况称为线程泄漏。

注意,只是这个线程的生命结束了,但其他的线程还是活着的。如果是代码有 BUG,那其他线程走到这一块估计也会挂掉的。

#2


引用 1 楼 bao110908 的回复:
线程代码中产生异常的话,那么这个线程的生命周期就结束了,这种情况称为线程泄漏。

注意,只是这个线程的生命结束了,但其他的线程还是活着的。如果是代码有 BUG,那其他线程走到这一块估计也会挂掉的。

 +1

#3


会继续执行

package test;


public class ExceptionInThread extends Thread{

Integer id;
ExceptionInThread(Integer id){
this.id = id;
}
/**
 * @param args
 */
synchronized void go(){
System.out.println("id is " + id);
throw new java.lang.NullPointerException();
}

public void run(){
// Bean b = new Bean();
// b.go(1);
this.go();
}

public static void main(String[] args) {
// TODO Auto-generated method stub
Thread ct = new ExceptionInThread(1);
Thread ct2 = new ExceptionInThread(2);
ct.start();
ct2.start();
}

}

#4


线程与线程之间除非你刻意安排,否则是无关的。也就是说,线程A里有了异常并不会影响线程B。

如果对于线程这些东西并不熟悉,而又想要做好并发处理的代码,可以考虑用我做的一些开源的工具类: http://jabb.sourceforge.net/javadoc/net/sf/jabb/util/thread/package-summary.html,文档可看这个PDF的最后一部分: http://jabb.sourceforge.net/doc/jabb_intro.pdf

这些类构成了一个小型的框架,能够简化多线程并行数据处理的程序开发。用起来很简单,只要这样:
1. 创建你自己的处理实现类,继承QueueProcessor或者QueueBatchUniqueProcessor,实现其中的process()方法。
2. 用BlockingQueue的实例来存放待处理的数据
3. 对于你自己的处理实现类,创建足够多的实例。每个实例都会有一个对应的工作线程在需要的时候被创
建。
4. 创建一个QueueConsumerGroup的实例来管理和控制整个多线程数据处理过程。

QueueProcessor适合于需要对数据进行一个一个地处理的场合。
QueueBatchUniqueProcessor适合于需要对数据进行分批处理的场合。而且它能够在每批中去除掉重复的数据。

#5


如果其他线程没有wait,或者wait中但不依赖这个挂掉的线程notify,那么会其他线程不会停止。如果线程挂掉是因为代码的问题,那么执行相同的代码的线程执行代码时也会挂掉。

#6


java线程synchronized同步一定要实现Theard线程或实现Runable接口 后再调用么?

#7


LZ要区分synchronized和线程
继承Theard类或实现Runable接口,是为了使用线程
而synchronized是为了让线程同步,意思不一样的
也就是说你用不用Thread或Runable,都可以使用synchronized,即你用不用多线程,都可以使用syncronized来修饰你的方法,以保证线程安全,并不是说使用synchronized就一定要继承Thread或实现Runnable,要区分这些不同的概念。