博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java高级-多线程深入
阅读量:5912 次
发布时间:2019-06-19

本文共 3048 字,大约阅读时间需要 10 分钟。

hot3.png

一、优雅的停止线程

开启线程的方式是:调用Thread中的start()方法,停止线程的方式:原本Thread提供了stop()方法,但是在JDK1.2坂本后就已经被禁用了。除了stop(),还有几个方法被禁用

    例如:

    1.停止多线程:public void stop();

    2.销毁多线程:public void destory();

    3.挂起线程:public final void suspend();

    4.恢复挂起的线程执行public final void resume();

这些方法被禁用的原因是因为:可能会导致死锁。

范例:实现线程优雅的停止

public class ThreadDemo3 {    public static boolean flag = true;    public static void main(String[] args) throws  Exception{        new Thread(()->{            long m = 0;           while (flag){               try {                   Thread.sleep(50);               } catch (InterruptedException e) {                   e.printStackTrace();               }               System.out.println(Thread.currentThread().getName()+" The  number is "+m++);           }        },"执行线程").start();        Thread.sleep(200);        flag=false;    }}

二、后台守护线程

充当保镖的角色,在多线程里面可以进行守护线程的定义,也就是说如果现在主线程的程序或其他线程在执行的时候,守护线程将一直存在。

    1.设置为守护线程:public final void setDaemon(boolean on);

    2.是否为守护线程:public final boolean isDaem();

范例:守护线程的使用

public class ThreadDemo4 {    public static void main(String[] args) throws  Exception {        Thread userThread = new Thread(()->{           for(int i = 0; i< 10; i++){               try {                   Thread.sleep(100);               } catch (InterruptedException e) {                   e.printStackTrace();               }               System.out.println(Thread.currentThread().getName()+"num = "+i);           }        },"用户线程");        Thread daemonThread = new Thread(()->{            for(int i = 0; i< Integer.MAX_VALUE; i++){                try {                    Thread.sleep(100);                } catch (InterruptedException e) {                    e.printStackTrace();                }                System.out.println(Thread.currentThread().getName()+"num = "+i);            }        },"守护线程");        daemonThread.setDaemon(true);        userThread.start();        daemonThread.start();    }}

运行结果:

24dfb0fd8c852871470aa2db2a2d822d0ae.jpg

可以发现所有的守护线程都是围绕在用户线程的周围,如果程序执行完毕,守护线程也就没有存在的必要了,最大的守护线程就是GC线程。

三、volatile关键字

在多线程的定义中,volatile关键字主要是在属性定义上使用的,表示此属性为直接数据操作,而不进行副本的拷贝处理。

在我们正常进行变量处理的时候往往会经历如下几个步骤:

    1.获取变量原有的数据内容副本;

    2.利用副本为变量进行数学计算;

    3.将计算后的变量,保存到原始空间之中;

而如果一个属性追加了volatile关键字,表示的就是不使用副本,而是直接操作原始变量。

9a671b5ec8f40fce1487b985cc8eac955b8.jpg

范例:valatile的正确使用

class MyThread implements Runnable{    public  volatile  int ticket = 5;    @Override    public void run() {        synchronized (this) {            while (this.ticket > 0) {                try {                    Thread.sleep(100);                } catch (InterruptedException e) {                    e.printStackTrace();                }                System.out.println(Thread.currentThread().getName() + "卖票 ticket = " + ticket--);            }        }    }}public class Main {    public static void main(String[] args) {        MyThread mt = new MyThread();        new Thread(mt,"票贩A").start();        new Thread(mt,"票贩B").start();        new Thread(mt,"票贩C").start();    }}

面试题:请解释volatile与synchronized的区别?

    1.volatile主要是属性上使用,而synchronized是在代码块和方法上使用的;

    2.volatile无法描述同步的处理,他只是一种直接内存的处理,避免了副本的操作;

转载于:https://my.oschina.net/chenzhou/blog/2051275

你可能感兴趣的文章
浏览器渲染流水线解析(一)
查看>>
Why Namespace? - 每天5分钟玩转 OpenStack(102)
查看>>
[Android]使用RecyclerView替代ListView(四:SeizeRecyclerView)
查看>>
.NET反编译之manager,base.AutoScaleMode修复
查看>>
【前端性能】必须要掌握的原生JS实现JQuery
查看>>
PgSQL · 应用案例 · 手机行业分析、决策系统设计-实时圈选、透视、估算
查看>>
【转】TIOBE 12 月排行榜:古老的 C 和后起之秀 Kotlin,谁是年度编程语言之王?...
查看>>
excel同时冻结首行和首列怎么操作
查看>>
IMG-后勤执行-仓库管理-主数据-定义拣配区(WM-13)
查看>>
【DG】DG的3种保护模式
查看>>
[20150107]关于print_table.txt
查看>>
Chrome 如何知道网站启用了SPDY 协议?
查看>>
8天玩转并行开发——第五天 同步机制(下)
查看>>
一次性关闭所有的Activity
查看>>
运算符 - PHP手册笔记
查看>>
二维数组的认识及其表示元素的两种方式
查看>>
linux 单网卡绑定两个ip
查看>>
LINUX下DNS的查看和配置
查看>>
如何用数据中心和云安全来对抗网络犯罪
查看>>
说良心话Visual Assit x真的是很好用的
查看>>