线程的创建方式:
继承Thread类:
实现Runnable接口
实现Callable接口

1.创建线程有哪几种方式
2、start()和run()方法的区别
3、什么是线程安全,通过什么方式实现线程安全
4、线程和进程之间的关系

TestMain:

public class TestMain {public static void main(String[] args) {Thread t=new Thread("线程名");Thread th=Thread.currentThread();th.setName("主线程");System.out.println(th.getName());System.out.println(t.getName());}
}

TestThread:

package cn.kgc.kb09;/*** @Author: ChaoKeAiMuZhi* @Date: 2020/8/5 14:19* @Description:使用继承Thread类的方式**/
public class TestThread extends Thread {@Overridepublic void run() {for (int i = 1; i <=100 ; i++) {System.out.println(Thread.currentThread().getName()+":"+i);System.out.println("线程休眠,进入阻塞状态");try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {/*TestThread t1=new TestThread();t1.setName("线程1");TestThread t2 = new TestThread();t2.setName("线程2");t1.start();t2.start();*/TestThread t=new TestThread();//区别在于只用建一次对象,这种比较常用t.setName("随便啥");Thread th1=new Thread(t);th1.setName("设置线程1");Thread th2=new Thread(t);th2.setName("设置线程2");th1.start();th2.start();}}
// An highlighted block
var foo = 'bar';

TestRunnable:

package cn.kgc.kb09;/*** @Author: ChaoKeAiMuZhi* @Date: 2020/8/5 14:41* @Description:实现Runnable接口的方法**/
public class TestRunnable implements Runnable {//实现接口,扩展性强@Overridepublic void run() {for (int i = 1; i <=100 ; i++) {System.out.println(Thread.currentThread().getName()+":"+i);System.out.println("礼让下");Thread.yield();//并不能确保线程就给了对方}}public static void main(String[] args) throws InterruptedException {TestRunnable r=new TestRunnable();System.out.println("线程创建前");Thread t1 = new Thread(r,"线程1");//线程创建之后默认就会进入就绪状态 init初始化方法Thread t2 = new Thread(r,"线程2");System.out.println("执行线程1");t1.start();//Thread.sleep(100);System.out.println("执行线程2");t2.start();System.out.println(t2.isAlive());}
}

TestTicket:

package cn.kgc.kb09;/*** @Author: ChaoKeAiMuZhi* @Date: 2020/8/5 16:27* @Description:**/
public class TestTicket implements Runnable {int ticket = 1000;int sold = 0;@Overridepublic void run() {while (ticket > 0) {synchronized (this) {ticket--;sold++;if (ticket < 0) return;System.out.println(Thread.currentThread().getName() + "买到了第" + sold + "张票,还剩余" + ticket);}}}public static void main(String[] args) {TestTicket t = new TestTicket();Thread t1 = new Thread(t, "123306");Thread t2 = new Thread(t, "携程");t2.start();t1.start();}
}

TestMethod:

package cn.kgc.kb09;/*** @Author: ChaoKeAiMuZhi* @Date: 2020/8/5 15:19* @Description:常用方法**/
public class TestMethod  {public static void main(String[] args) throws InterruptedException {TestRunnable r=new TestRunnable();Thread t1=new Thread(r,"线程1");System.out.println("线程1创建");System.out.println("线程2创建");Thread t2=new Thread(r,"线程2");t1.join();System.out.println("上面执行了join方法,主线程会等t1执行完成");
//        t1.setPriority(10);
//        t2.setPriority(1);t1.start();t2.start();/*for(int i=0;i<5;i++){if(i==2){t1.join();}System.out.println(i+1+"次主线程中的循环");}*/}
}

TestCallable:

package cn.kgc.kb09;import java.util.concurrent.*;/*** @Author: ChaoKeAiMuZhi* @Date: 2020/8/5 17:25* @Description:**/
public class TestCallable implements Callable<Integer> {@Overridepublic Integer call() throws Exception {for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+":"+(i+1));}return 3;}public static void main(String[] args) throws ExecutionException, InterruptedException {TestCallable t=new TestCallable();FutureTask<Integer> f=new FutureTask<Integer>(t);Thread th=new Thread(f);th.start();System.out.println(f.get());ExecutorService single = Executors.newSingleThreadExecutor();ExecutorService executorService = Executors.newFixedThreadPool(3);}}

Synchronized关键字:

提问:
java集合的Hashtable,它能够保证put和get方法同步,两方法都有synchronized 关键字,但是怎么能保证这两个方法同步的呢?
[码农翻身] 刘欣:
synchronized 不就是对 this 对象加锁吗? 假设一个线程正在put ,另外一个线程就没法调用get,因为拿不到锁

提问:
volatile竟然保持了可见性,那为啥还是不能保证线程安全呢?每个线程都有最新的值,那多个线程同时修改怎么会不安全?
[码农翻身] 刘欣:
我似乎在哪里见过这个问题啊,是不是在公众号提问过?
多线程编程要求原子性,可见性和有序性,这样才能保证结果是正确的。
volatile保证了可见性,这个意思是说:当读一个volatile变量(如count)的时候, 每次都从主内存读, 而不是从自己的工作内存去读。
但是,当你读取完成以后,要对这个变量做操作, 这时候并不会再从主内存读了
例如有这么一个操作 count = count +1;
count 的值在主内存是100,两个线程都在执行。 他们同时读到了100。
然后都执行加1操作, 都得到了101, 再写回主内存,结果是101,有一个被覆盖了。
所以volatile不能保证原子性, 还需要如synchronized 这样的同步操作才行。
volatile还能保证有序性,防止指令重排,有个著名的场景就是单例模式。

提问:
CAS的效率为什么比synchronized效率高
[码农翻身] 刘欣:
1.CAS的底层是Atomic::cmpxchg, 这个函数调用了几个汇编指令来实现,汇编指令操作的应该是用户空间的内存,所以我觉得不用进入内核态,也就无需系统调用。
2.sync 那个那个关键字在升级为重量级锁的时候,线程如果不持有锁,肯定要进入阻塞队列,等到锁被释放时再去争抢,抢到了才具备执行的资格, 不像执行CAS的线程一直在ready 和run 这两个状态切换,肯定是要慢很多的。

2020.8.5课堂笔记(多线程)相关推荐

  1. 2020.8.4课堂笔记(IO 缓冲流,对象流)

    课前复习: 1.什么是io流,如何分类 流向: 输入:InputStream,Reader 输出:OutputStream,Writer 按读取的单元: 字节流:InputStream,OutputS ...

  2. 2020.10.20课堂笔记(java8新特性 lambda表达式)

    一.什么是Lambda? 我们知道,对于一个Java变量,我们可以赋给其一个"值". 如果你想把"一块代码"赋给一个Java变量,应该怎么做呢? 比如,我想把右 ...

  3. 2020.4.22课堂笔记(继承、多态、抽象类、抽象方法)

    在继承的情况下,子类的方法满足以下条件: 1.方法名相同 2.参数列表相同 3.返回值类型相同,或者是父类返回值类型的子类 4.访问修饰符的权限不能小于父类方法 5.抛出的异常不能大于父类(严于) 多 ...

  4. 2020.11.10课堂笔记(Apache Spark 分布式计算原理)

    Spark WordCount运行原理 一.RDD的依赖关系 为什么需要划分Stage 数据本地化- 移动计算,而不是移动数据 保证一个Stage内不会发生数据移动 Lineage:血统.遗传 RDD ...

  5. 2020.11.26课堂笔记(sparkGraphx算法之pregel)

    参考博客:https://blog.csdn.net/hanweileilei/article/details/89764466 大佬博客写的很详细,不用继续看这篇了,随便写一些记录一下. Prege ...

  6. 杜国光博士,基于视觉的机器人抓取--物体定位,位姿估计到抓取估计课堂笔记

    基于视觉的机器人抓取--物体定位,位姿估计到抓取估计课堂笔记 杜国光博士在智东西公开课上讲了<基于视觉的机器人抓取--物体定位,位姿估计到抓取估计>的精彩课程 满满的干货,记下来,后面慢慢 ...

  7. 【GAMES101】课堂笔记1--计算机图形学概述

    文章目录 前言 课堂笔记 1 图形学介绍 1.1 图形学应用领域 1.2 图形学前沿Challenges 2 本课程介绍 2.1 课程内容 2.2 非课程内容 2.3 课程相关 前言 本文为GAMES ...

  8. 张召忠:第四次工业革命来了》课堂笔记

    <张召忠:第四次工业革命来了>课堂笔记 讲师介绍 第四次工业革命是什么 第四次工业革命的形态 第四次工业革命有哪些内容 5G 无人驾驶 虚拟技术VR和AR 物联网 智能制造 面对第四次工业 ...

  9. 离散数学笔记 - 手写 - 课堂笔记

    概率论 课堂笔记+思维导图 传送门 线性代数 课堂笔记+思维导图 离散数学 课堂笔记+思维导图 高数下 思维导图 离散数学 课堂笔记 持续更新 2020.6.1儿童节快乐~!!! 已全部学完 注: 笔 ...

最新文章

  1. 让 QtWebkit 支持跨域CROS - nowboy的CSDN博客 - 博客频道 - CSDN.NET
  2. 生成随机数放入整型数组怎么判断有没有重复_图的应用(1)-连通图的最小生成树(Prim算法和Kruskal算法)...
  3. sublime配置运行python文件的快捷键
  4. CSS中提升优先级属性!important的用法总结
  5. Andrew Ng机器学习公开课笔记 -- Logistic Regression
  6. Leetcode PHP题解--D7 905. Sort Array By Parity
  7. 好书推荐《父与子的编程之旅:与小卡特一起学Python》
  8. matlab 误差修正模型,求问大神用R做VEC(误差修正)模型的程序包或者代码是什么啊?...
  9. HTC手机手动解锁教程
  10. 【附源码】计算机毕业设计java信用卡增值业务系统设计与实现
  11. Audio Hijack教程:轻松捕获iOS设备中的音频
  12. webstorm热更新
  13. 单片机/树莓派扩展双串口(TTL和RS485)
  14. 从简历被拒到收割今日头条offer经验总结
  15. 【Lua】Lua基础语法
  16. 杭电计算机复试面试题库,杭电电子分院历年复试题(整理版).doc
  17. trunk端口配置的PVID
  18. Python3 小技巧三 每十个数取一次值
  19. 《人工智能及其应用》第1章书后题 | 西电《人工智能导论》作业
  20. ThinkPad_T430重装系统

热门文章

  1. 音乐ToB赛道的隐形巨头
  2. uoj240 【IOI2016】aliens
  3. leetcode——回溯法基础
  4. 修改idea快捷键注释样式
  5. 甲骨文称:IT安全投得多不如投得巧
  6. 渔夫打鱼问题 java思路_心理故事:一个渔夫出海打鱼,怎么会饿死?
  7. matlab实现计算全息,MATLAB实现计算全息.doc
  8. 无线网络安全测试软件
  9. 论文写作之常见错误总结
  10. docker 下声卡无法连接