如何关闭java线程?
关闭线程有几种方法,
一种是调用它里面的stop()方法
另一种就是你自己设置一个停止线程的标记 (推荐这种)
代码如下:
package com.demo;
//测试Thread的stop方法和自己编写一个停止标记来停止线程;
public class StopThread implements Runnable{
//停止线程的标记值boolean;
private boolean flag = true;
public void stopThread(){
flag = false;
}
public void run(){
int i=0;
while(flag){
i++;
System.out.println(Thread.currentThread().getName()+":"+i);
try{
Thread.sleep(1000);
}catch(Exception e){
}
System.out.println(Thread.currentThread().getName()+"==>"+i);
}
}
public static void main(String args[]){
StopThread st = new StopThread();
Thread th = new Thread(st);
Thread th1 = new Thread(st);
th.start();
th1.start();
try{
Thread.sleep(5500);
}catch(Exception e){
}
/*
如果使用Thread.stop方法停止线程,不能保证这个线程是否完整的运行完成一次
run方法;但是如果使用停止的标记位,那么可以保正在真正停止之前完整的运行完
成一次run方法;
*/
th.stop();
st.stopThread();
}
}
java中throw抛出的一些异常,程序不进行处理程序编译也不会错误?
不会,抛出异常本意就是在某些不满足条件的时候终止程序运行,但是也可以选择捕获处理,捕获后就不会使程序终止。但是为什么有的系统方法必须让你捕获呢?
那是因为该方法使用throws关键字声明了,作用就是将throw抛出的异常显示的交给调用者处理,如果调用者不处理,就不try-catch那么才会编译不通过。
JVM报错“Failed to write core dump“是什么问题,如何解决?
操作系统有文件错误,该信息表示程序非正常终止 也有可能是程序对堆栈的处理不当,建议重新下载这个程序,到不同服务器下载。 下面是我在网上找的 Runtime Error 的解释如下 Runtime error就是在运行期间出现的错误,运行时错误不同于系统
一个java进程发生了OOM后,该进程或服务一定会被杀死吗?
不一定。
一个线程 OOM 后,其他线程是可以正常运行的,但是内存泄露之后可能会导致整个程序内存溢出,最终程序不可用。
那么我们下面说一下,一个线程 OOM 了,为什么其他线程不受影响呢?
要回答这个问题,我们先来回想一下 java 的内存结构。如下图所示:
我们知道,多线程的时候,每个线程都拥有一个栈和一个程序计数器。栈和程序计数器用来保存线程的执行历史和线程的执行状态,是线程私有的资源。堆是线程共享的,所以理论上一个线程 OOM 了,其他线程应该受影响才对啊,实际上却并不是,这是什么原因呢?
有兴趣的可以按照我下面的这段代码自己去跑一下,测试一下这个内存溢出。
然后结合 JvisualVM 工具,你会看到,在程序内存溢出之后,溢出的内存的线程所占的内存会被快速释放。如下图所示
根据上图,我们可以得出当一个线程抛出 OOM 异常后,它所占据的内存资源会被快速的释放掉,从而不会影响其他线程的运行!
另外当一个线程 OutOfMemoryError 后,如果这个 OutOfMemoryError 被捕获,那么 catch 之后吞掉的话程序还能试着继续运行。发生 OutOfMemoryError 之后,只是当前这个线程申请更多的内存的时候不被 JVM 允许,所以会抛出 OutOfMemoryError 异常。当抛出 OutOfMemoryError 异常后,当前这个线程会被退出,它所占的内存会被 JVM 清理掉。
那么 JVM 为什么要这么设计呢?
答案是,Java 程序通常不是为了适应意外的异常而设计的,OOM 之后可能导致应用状态不一致,建议最好重启。
还没有评论,来说两句吧...