多线程基础二(线程的启动、终止,线程面临的三种问题)

一、线程的启动、终止方式

 启动: 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规范了上述线程的三个问题

原文地址:https://www.cnblogs.com/flgb/p/9902706.html

时间: 2024-08-09 11:00:43

多线程基础二(线程的启动、终止,线程面临的三种问题)的相关文章

Java多线程基础(四)Java传统线程同步通信技术

Java多线程基础(四)Java传统线程同步通信技术 编写代码实现以下功能 子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次. 分析 1)子线程循环10次与主线程循环100次必须是互斥的执行,不能出现交叉,下面代码中通过synchronized关键字实现此要求: 2)子线程与主线程必须交替出现,可以通过线程同步通信技术实现,下面代码中通过bShouldSub变量实现此要求: 其他需要注意的地方 1)其中business变量必须声

java线程中断和终止线程运行

ava中启动一个线程很容易,通常情况下我们都是等到任务运行结束后让线程自行停止.但有时需要在任务正在运行时取消他们,使得线程快速结束.对此Java并没有提供任何机制.但是我们可以通过Java提供的线程中断机制来实现. 首先来看Thread类三个和中断有关的方法: public class Thread { // 发出一个中断请求,把标志位设定为中断状态,不会终止线程运行. // 其他线程试图调用该方法,会检测是否有权限中断该线程(正常情况 // 下不会存在权限问题,这里可以忽略) public

《Java并发编程》之线程中断与终止线程运行

Java中启动一个线程很容易,通常情况下我们都是等到任务运行结束后让线程自行停止.但有时需要在任务正在运行时取消他们,使得线程快速结束.对此Java并没有提供任何机制.但是我们可以通过Java提供的线程中断机制来实现. 首先来看Thread类三个和中断有关的方法: public class Thread { // 发出一个中断请求,把标志位设定为中断状态,不会终止线程运行. // 其他线程试图调用该方法,会检测是否有权限中断该线程(正常情况 // 下不会存在权限问题,这里可以忽略) public

Android项目实战(二):安卓应用程序退出的三种方法

原文:Android项目实战(二):安卓应用程序退出的三种方法 现在的APP退出的时候都不是让用户点击了“后退键”就退出.防止用户点错了后退键而造成的用户体检不好. 一年前搞的Demo代码不见了,重新写下就当是复习和以后直接拿来用把 目前流行的解决一般分为两种: 一.按一次后退键显示一个对话框决定是否退出 1 @Override 2 public boolean onKeyDown(int keyCode, KeyEvent event) { 3 // TODO Auto-generated m

UNIX环境编程学习笔记(26)——多线程编程(一):创建和终止线程

lienhua342014-11-08 在进程控制三部曲中我们学习了进程的创建.终止以及获取终止状态等的进程控制原语.线程的控制与进程的控制有相似之处,在表 1中我们列出了进程和线程相对应的控制原语. 表 1: 进程原语和线程原语的比较 进程原语 线程原语 描述 fork pthread_create 创建新的控制流 exit pthread_exit 从现有的控制流中退出 waitpid pthread_join 从控制流中得到退出状态 atexit pthread_cleanup_push

线程操作之终止线程

线程的终止时通过Thread类的abort方法来实现的,如一个现成执行时间太长,用户有可能要终止这个线程,这就要使用此方法 注意:在线程调用Abort方法时,会引发ThreadAbortExcepion 异常,如果没有捕捉异常,线程将会终止 实例 通过While判定在屏幕上输出">"字符的线程是否为执行完毕,当线程没有执行完毕时,就计算循环次数,当达到5次时,就终止线程. class Program { public static void meth() { for (int i

ThreadPoolExecutor使用和思考(上)-线程池大小设置与BlockingQueue的三种实现区别

工作中多处接触到了ThreadPoolExecutor.趁着现在还算空,学习总结一下. 前记: jdk官方文档(javadoc)是学习的最好,最权威的参考. 文章分上中下.上篇中主要介绍ThreadPoolExecutor接受任务相关的两方面入参的意义和区别,池大小参数corePoolSize和maximumPoolSize,BlockingQueue选型(SynchronousQueue,LinkedBlockingQueue,ArrayBlockingQueue):中篇中主要聊聊与keepA

ThreadPoolExecutor使用和思考-线程池大小设置与BlockingQueue的三种

工作中多处接触到了ThreadPoolExecutor.趁着现在还算空,学习总结一下. 前记: jdk官方文档(javadoc)是学习的最好,最权威的参考. 文章分上中下.上篇中主要介绍ThreadPoolExecutor接受任务相关的两方面入参的意义和区别,池大小参数corePoolSize和maximumPoolSize,BlockingQueue选型(SynchronousQueue,LinkedBlockingQueue,ArrayBlockingQueue):中篇中主要聊聊与keepA

Java多线程基础(二)

信号量Semaphore,类似于锁的功能,用于多线程中对一组资源的控制. acquire方法用于尝试获取一个资源,未获取前将一直等待.release用于释放一个资源,release的前提是已经获得了一个资源. package multiThread; import java.util.concurrent.Semaphore; public class SemaphoreTest { public static void main(String [ ] args) { int N = 8; //