import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Created by csj on 2017/3/4.
*
* 实现多线程的两种方式:1. extends Thread , implements Runnable,Thread 也是implements Runnable 接口,这两者之间存在多态关系
* Thread ,Runnable 之间的不同:Thread 类创建的线程不支持多继承, implements Runnable 可以实现多继承
* Thread ,Runnable 之间的相同:用这两种方式创建的进程在工作时的性质时一样
* 如何正确有效更好的停止线程,什么叫停止:该线程处理完任务完之前停掉,放弃正在做的操作.
* Thread.stop()该方法已经废弃,而且该方法是不安全的。
* Thread.interrupt() 在当前线程打了一个停止的标记,还没停止,需要加一个判断;
* this.interrupted() 测试当前线程是否已经中断,你说哪个线程?就是运行这个方法的线程! 该方法具体清除状态的功能,也就是说当该线程是标志的状态为true时,调用该方法之后,状态就会变为false
* this.isInterrupted() 测试线程是否已经中断,与interrupted 的区别是该方法不会清除线程的状态标志
*/
public class Threadrun extends Thread{
public static final Logger logger = LoggerFactory.getLogger(ThreadTest.class);
public Threadrun(){
logger.info("thread name = {}",Thread.currentThread().getName());
}
@Override
public void run() {
super.run();
for(int i =0 ; i<3; i++){
try {
logger.info("thread isInterrupt1 = {} , isInterrupt2 = {}", this.isInterrupted(), this.isInterrupted());
if(this.isInterrupted()){
logger.info("thread interrupt1 = {} ,interrupt2 = {}", this.interrupted(), this.interrupted());
throw new InterruptedException();
}
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
logger.info("i = {} ", i);
}
}
}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Created by csj on 2017/3/4.
*/
public class ThreadTest {
public static final Logger logger = LoggerFactory.getLogger(ThreadTest.class);
public static void main(String args[]) throws InterruptedException {
try{
Threadrun threadrun = new Threadrun();
threadrun.start();
threadrun.interrupt(); //中断线程
threadrun.sleep(15); //在指定的毫秒数内让当前正在执行的线程休眠,或者说暂停执行;
logger.info("thread islive = {}, interrupted = {}",
threadrun.isAlive(), //判断线程是否处于活动状态;
threadrun.interrupted()//测试当前线程是否已经是中断状态,执行后具有将状态标志清除为false;
);
}catch(InterruptedException e){
e.getStackTrace();
}
}
}
2017-03-04 22:01:21.479 [main] INFO ThreadTest - thread name = main
2017-03-04 22:01:21.485 [Thread-0] INFO ThreadTest - thread isInterrupt1 = true , isInterrupt2 = true
2017-03-04 22:01:21.485 [Thread-0] INFO ThreadTest - thread interrupt1 = true ,interrupt2 = false
java.lang.InterruptedException
at Threadrun.run(Threadrun.java:32)
2017-03-04 22:01:21.505 [main] INFO ThreadTest - thread islive = false, interrupted = false
说明参考:
从日志中的第一行可以看出运行main()的的线程名称为 main,由Threadrun 中的构造函数产生。
从日志中的第二行可以看出 isInterrupted() 方法没有清除表标识的功能,因为第二次调用该方法状态依然为true,
从日志中的第三行可以看出, interrupted()具有清除状态的功能,因为第二次调用该方法时对应的线程状态的标识已经为false,该条日志是在进入if条件之后才能产生,
进入if之后抛出异常,在第四第五行可以看出,通过break结束循环
从日志的第六行可以看出名称为main的线程的live状态为false。说明该线程已经停止