java不安全的线程和如何正确关闭线程

我先简单举一个线程不安全的例子
大家请自觉把i–当作银行取款过程,基本所有线程例子都是以银行取款为例,因为银行取款是最需要安全的线程的了

public class demo1 extends Thread{
private int i=10;
@Override 
public void run() {
	i--;                  //想等于一次取款过程
	System.out.println(i);
}
	
}

public class Main {

	public static void main(String[] args) {
  demo1 demo=new demo1();
  Thread d1=new Thread(demo);
  Thread d2=new Thread(demo);
  Thread d3=new Thread(demo);
  Thread d4=new Thread(demo);
  d1.start();
  d2.start();
  d3.start();
  d4.start();
	}

}

在这里插入图片描述
实际上他们每次的结果都不相同,但是并不符合我们所期待的结果,如果这是在银行,4次取款后10变成了7,银行肯定是亏损的,所以,这是一次不安全的线程

解决方法很简单,synchronized,请记住这个单词,他是基本上大多数线程不安全的解决方法

public class demo1 extends Thread{
private int i=10;
@Override 
synchronized public void run() {
	i--;                  //想等于一次取款过程
	System.out.println(i);
}
	
}

java不安全的线程和如何正确关闭线程_第1张图片

下面是如何正确停止线程,stop方法很早就被停用了,而且太暴力很不安全

有一种比较巧妙的停止方式,就是设置一个标志信息比如下面的a,a是true时线程的内容运行,反之,跳过,然后设置一个方法更改a的值

public class demo1 extends Thread{
private volatile boolean a=true;
private int i=10;
@Override 
synchronized public void run() {
while(a) {
	i--;
	System.out.println(i);
}
}
public void cancel()	{
	a=false;
}
}

除此之外还有 interrupt()会抛出异常,然后捕抓异常停止线程。这种相对来说并不算太好,这里不介绍了

你可能感兴趣的:(线程,java)