7 个解决方案
#1
线程代码中产生异常的话,那么这个线程的生命周期就结束了,这种情况称为线程泄漏。
注意,只是这个线程的生命结束了,但其他的线程还是活着的。如果是代码有 BUG,那其他线程走到这一块估计也会挂掉的。
注意,只是这个线程的生命结束了,但其他的线程还是活着的。如果是代码有 BUG,那其他线程走到这一块估计也会挂掉的。
#2
+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适合于需要对数据进行分批处理的场合。而且它能够在每批中去除掉重复的数据。
如果对于线程这些东西并不熟悉,而又想要做好并发处理的代码,可以考虑用我做的一些开源的工具类: 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,要区分这些不同的概念。
继承Theard类或实现Runable接口,是为了使用线程
而synchronized是为了让线程同步,意思不一样的
也就是说你用不用Thread或Runable,都可以使用synchronized,即你用不用多线程,都可以使用syncronized来修饰你的方法,以保证线程安全,并不是说使用synchronized就一定要继承Thread或实现Runnable,要区分这些不同的概念。
#1
线程代码中产生异常的话,那么这个线程的生命周期就结束了,这种情况称为线程泄漏。
注意,只是这个线程的生命结束了,但其他的线程还是活着的。如果是代码有 BUG,那其他线程走到这一块估计也会挂掉的。
注意,只是这个线程的生命结束了,但其他的线程还是活着的。如果是代码有 BUG,那其他线程走到这一块估计也会挂掉的。
#2
+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适合于需要对数据进行分批处理的场合。而且它能够在每批中去除掉重复的数据。
如果对于线程这些东西并不熟悉,而又想要做好并发处理的代码,可以考虑用我做的一些开源的工具类: 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,要区分这些不同的概念。
继承Theard类或实现Runable接口,是为了使用线程
而synchronized是为了让线程同步,意思不一样的
也就是说你用不用Thread或Runable,都可以使用synchronized,即你用不用多线程,都可以使用syncronized来修饰你的方法,以保证线程安全,并不是说使用synchronized就一定要继承Thread或实现Runnable,要区分这些不同的概念。