多线程基础二(线程的启动终止,线程面临的三种问题)
Posted flgb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程基础二(线程的启动终止,线程面临的三种问题)相关的知识,希望对你有一定的参考价值。
一、线程的启动、终止方式
启动: start native(调用外部接口启动)
终止: stop(类似kill,暴力终止) interrupt 中断的方式 通过指令的方式 volatile boolean stop = false;
public class InterruptDemo {
private static int i;
public static void main(String[] args) {
Thread thread = new Thread(()->{
while(!Thread.currentThread().isInterrupted()){//判断是否有interrupt标识
i++;
}
System.out.println(i);
},"interrupt");
thread.start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
thread.interrupt();//设置interrupt标识为true
System.out.println(Thread.interrupted());
}
}
二、线程的面临的三大问题
(1)可见性问题
private volatile static boolean stop = false;可见性
//private static boolean stop = false;
//main主线程
public static void main(String[] args) throws InterruptedException {
//thread子线程
Thread thread = new Thread(()->{
int i = 0;
while (!stop){
i++;
}
System.out.println(i);
});
thread.start();
TimeUnit.SECONDS.sleep(1);
stop = true;//主线程改变值,子线程不可见,加上volatile后子线程可见
}
(2)原子性问题
private static int count = 0;
public static void inc(){
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
}
public static void main(String[] args) throws InterruptedException {
for (int i=0 ; i<1000;i++){
new Thread(AtomicDemo::inc).start();
}
Thread.sleep(4000);
System.out.println("运行结果:"+count);
}
运行结果却不一定能够是1000,之间相互影响
(3)有序性问题
根据编译,缓存的一致性问题等因素,程序的执行可能不会按照所编写的执行。
JMM规范了上述线程的三个问题
以上是关于多线程基础二(线程的启动终止,线程面临的三种问题)的主要内容,如果未能解决你的问题,请参考以下文章