• 创建线程的几种方法
  • 实现多线程的几种方式
  • 线程之间同步
    • 为什么要同步
    • 同步有哪些策略
      • synchronized
      • Lock
    • 线程的一些方法介绍和object的wait notify

创建线程的几种方法

“你知道茴字有几种写法吗?”孔乙己笑着说道.
“你知道创建线程有几种方法吗?”

  • 继承Thread
    ------------MThread.java----------------class MThread extends Thread{@Overridepublic void run(){//自己的代码逻辑}   }-------------main函数--------------------Thread t = new MThread();t.start();
  • 实现Runnable
------------MRunnable.java----------------
class MRunnable implements Runnable
{@Overridepublic void run(){//自己的代码逻辑}
}
-------------main函数--------------------
Thread t = new Thread(new mRunnable());
t.start(); 
  • 实现Callable接口,通过FuctureTask 类实现有返回值的线程
-----------------CallbackImpl-------------
class CallableImp implements Callable<Integer>
{private boolean isInterrupt = false;@Overridepublic Integer call() throws Exception{while (!isInterrupt){System.out.println(" call call");Thread.sleep(1000);isInterrupt = true;}return new Integer(13);}
}
---------------------main.java--------------------
CallableImp call = new CallableImp("AAA");
//FutureTask是Future接口的实现类,它的作用是获取Callable的返回值
FutureTask<Integer> task = new FutureTask<>(call);
Thread thread = new Thread(task);
thread.start();
//获取返回值,这个方法一直等待线程结束,然后把返回值返回
//另外还有一个重载的函数,提供了超时退出等待的时间参数
// get(long timeout, TimeUnit unit)
Integer res = task.get();
System.out.println(res);

实现多线程的几种方式

多线程很简单,new 多个线程就OK.简单直接,但是也很粗暴.这种方式不便于管理,而且线程的创建是需要很多资源的.我们自然而然想到,多线程的目的是为了获得计算能力,如果我们的线程使用完之后不会被释放,可以回收再利用,那该多方便

CallableImp call1 = new CallableImp("callable___1");
CallableImp call2 = new CallableImp("callable___2");
CallableImp call3 = new CallableImp("callable___3");
CallableImp call4 = new CallableImp("callable___4");ExecutorService e = Executors.newFixedThreadPool(4);
e.submit(call1);
e.submit(call2);
e.submit(call3);
e.submit(call4);
Thread.sleep(5000);
//执行完毕之后关闭
//如果想粗暴的关闭
//使用shutdownNow()
e.shutdown();

Executors有几个静态函数用来构造各种线程池
submit就是把 Runnable Callable 添加到线程池中等待执行,其返回值是Future对象,同样用于获取将来的返回值

上面是线程池,Java 7 还有一个用于多核计算,分割大任务,多线程计算之后,再合并计算结果的框架 Fork/Join框架,下次再写 (其实是还没吃透 ~逃 )

线程之间同步

为什么要同步(java线程内存模型),也就是说多线程不同步回引发什么问题(银行取钱案例)

为什么要同步?


上图为Java 内存模型 对一个主存里面的对象操作其实是先把这个对象复制到本地内存然后读写之后更新到主存里面,这样就导致了如果线程调度打断了更新那么就会导致出现错误,所以需要同步,同步就是然某些操作只可能被一个线程执行,也就是虽不存在多个线程执行同一个操作

同步有哪些策略?

synchronized

synchronized可以修饰方法,也可以修饰块

//括号里的参数是你想获得的哪个对象的锁参数就是那个对象
synchronized(this)
{
//对某一个共享对象的操作
}//同步方法是锁的目标是this
public synchronized void function()
{
}

释放锁的情况

  • 同步块执行完毕
  • 同步块遇到了wait()

不会释放的情况

  • 遇到sleep,yeild
  • suspend挂起线程

明天再写,碎觉~


我来更新啦

Lock

因为synchronized是有局限性的,例如我们需要在多个线程里面对一个共享数据执行些操作和读操作,自然想到应该线程之间的读和写不能同时进行,写和写也不能,但是读和读之间应该是可以同时进行的.那么我们用synchronized应该怎么实现呢

-----------Data.java--------------
class Data
{private String data = null;public Data(String data){this.data = data;}public synchronized  void setData(String newData){System.out.println(this.getName()+"写入数据= " + newData);try{Thread.sleep(10);}catch(){}data = newData;}public synchronized String getData(){System.out.println(this.getName()+"读取数据= "+data);try{Thread.sleep(10);}catch(){}return data;}}------------MThread.java-----------------
class MThread
{private Data d= null;public MThread(Data d){this.d = d;}@Overridepublic void run(){String data = d.get();d.setData(this.getName()+"设置数据");}
}-------------main--------------
Data d = new Data("默认数据");
new MThread(d).start();
new MThread(d).start();
new MThread(d).start();

我们发现读和读之间也变成互斥的了
这个时候如果采用Lock就会很方便的实现读与读之间的不互斥关系

-----------Data.java--------------
class Data
{private ReadWriteLock lock = new ReentrantReadWriteLock(); private String data = null;public Data(String data){this.data = data;}public void setData(String newData){lock.writeLock().lock();try{System.out.println(this.getName()+"写入数据= " + newData);try{Thread.sleep(10);}catch(){}data = newData;}   finally{lock.writeLock().unlock();}}public String getData(){lock.readLock().lock();try{System.out.println(this.getName()+"读取数据= "+data);try{Thread.sleep(10);}catch(){}return data;}finally{lock.readLock().unlock();}}}

通过读写锁就可以很方便的控制互斥与费互斥,另外还有很多的Lock子类供我们使用,参见api

线程的一些方法介绍和object的wait notify

  • join
    这个方法的作用是

    -----当前在主线程MainThread中------
    threadA.join();

    作用就是主线程MainThread等待threadA线程执行完毕再往下执行

  • yield
    这个方法是调用者的线程放弃占用CPU,也就是释放CPU,然后大家再一起竞争CPU的使用权. 这个方法不会释放锁

  • sleep
    这个方法是释放CPU一段时间,但是注意这个方法不会释放锁
  • wait
    这个方法是Object中的方法,它的作用是使得当前这个线程进入等待状态,一直等待下去(ps : 可以使用带参数的重载函数起设定一个超时等待期限),直到有其他线程调用了notify系列函数 这个方法释放锁
  • notify
    这一系列的函数用来使得进入等待状态的线程重新正常工作

Java多线程碎碎念相关推荐

  1. Java实现 蓝桥杯VIP 算法提高 分分钟的碎碎念

    算法提高 分分钟的碎碎念 时间限制:1.0s 内存限制:256.0MB 问题描述 以前有个孩子,他分分钟都在碎碎念.不过,他的念头之间是有因果关系的.他会在本子里记录每一个念头,并用箭头画出这个念头的 ...

  2. Jerry的碎碎念:SAPUI5, Angular, React和Vue

    2019独角兽企业重金招聘Python工程师标准>>> 去年我去一个国内客户现场时,曾经和他们IT部门的一位架构师聊到关于在SAP平台上进行UI应用的二次开发时,UI框架是选用UI5 ...

  3. 数据结构碎碎念(一)

    碎碎念 在大一学习C语言的时候,举过一个用栈实现的括号匹配算法,当时觉得很难,不过现在回顾起来,这个算法也算是比较简单的一个关于栈的应用了.而现在所常见的算法问题也都是什么中缀表达式转后缀表达式,双栈 ...

  4. Rust 与服务端编程的碎碎念

    Rust 与服务端编程的碎碎念 https://zhuanlan.zhihu.com/p/30028047 Rust 是 Mozilla 推出的一门系统编程语言,非常看重内存安全,是一门非常优秀的语言 ...

  5. 每月碎碎念 | 2019.08

    Hi,这里是新开辟的"碎碎念"的世界. 这个区域作为记录心情的地方,把每日的所思所想所感所悟记录在这里,当做一个写日记的地方,每个月底汇总成一篇文章,只给我的朋友看. 不知不觉一个 ...

  6. 每月碎碎念 | 2019.09

    Hi,这里是新开辟的"碎碎念"的世界. 这个区域作为记录心情的地方,把每日的所思所想所感所悟记录在这里,当做一个写日记的地方,每个月底汇总成一篇文章,只给我的朋友看. 2019-9 ...

  7. 前端碎碎念 之 nextTick, setTimeout 以及 setImmediate 三者的执行顺序

    『前端碎碎念』系列会记录我平时看书或者看文章遇到的问题,一般都是比较基础但是容易遗忘的知识点,你也可能会在面试中碰到. 我会查阅一些资料并可能加上自己的理解,来记录这些问题.更多文章请前往我的个人博客 ...

  8. 参加海峡两岸城市地理信息系统论坛2010 年会(一张图、规划信息化和空间句法的碎碎念)...

    上周末去清华建筑学院开了个会,叫做海峡两岸城市地理信息系统论坛2010 年会,主题很大,但是内容比较集中一些,就是围绕着GIS与城市规划.一天下来听了20个报告,挺佩服主办方的时间控制,这么密集的报告 ...

  9. PMcaff写给大家的年终碎碎念 PMcaff | 记录

    今天是大年三十,2014马上就要结束了,送上新春祝福之前,碎碎念的小希有话想跟大家说. 瞧这一年 小米在硬件行业继续如鱼得水,科幻片里的智能家居生慢慢变成生活. 阿里巴巴在纳克达斯扬眉吐气了一把,一夜 ...

  10. 机器学习碎碎念:霍夫丁不等式

    点击上方"AI有道",选择"设为星标" 关键时刻,第一时间送达! 红色石头每天碎碎念一些机器学习知识和概念,大家一起学习,每天进步一点点!喜欢的话别忘了文末点赞 ...

最新文章

  1. python excel 教程推荐_python对Excel按条件进行内容补充(推荐)
  2. csapp 大作业 hello的一生
  3. H5+Mui文件配置 vue-resource基本使用方法
  4. 微型计算机断电后信息将会丢失,计算机基础知识试题及答案a2
  5. Maven 的一个问题
  6. 财务报表开发实例分析:几个通用维度介绍与关键点
  7. C++ main函数中参数argc和argv相关定义与研究
  8. 使用javadoc命令制作帮助文档(API)
  9. 区块链入门教程,这一篇就足够了
  10. 软考嵌入式中级经验分享+真题教材
  11. GitLab Admin Area
  12. Dapps解封大众市场的动力
  13. T2695 桶哥的问题——吃桶
  14. 解决No thread-bound request found: Are you referring to request attributes outside of an actual web...
  15. ᑋᵉᑊᑊᵒ ᵕ̈ᰔᩚ
  16. android应用加固后闪退,梆梆加固,启动就闪退了
  17. android 音乐播放 启动方式 (3)服务通过发送广播来控制activity显示进度等
  18. 华为机试--简单题(一)
  19. java Date.getDay()
  20. Linux下 C 遍历目录(opendir,readdir函数)

热门文章

  1. 分析1.6万部电影,找出了华语电影烂片王
  2. 图像风格迁移(动手学深度学习)
  3. Codeforces 832D题解报告
  4. This object has not been built解决方案
  5. xp计算机硬盘序列号,发表一个最简单的XP以上系统中获取CPUID、硬盘序列号、BIOS序列号等等的函数!(100分)...
  6. 手机有没有制作日历的软件?制作工作日历可用手机便签
  7. 生态对对碰|OceanBase 安华金和打造数据库安全联合解决方案
  8. 【20211217】【信号处理】从 Matlab 仿真角度理解栅栏效应
  9. python嵌入式系统开发技术_Python在嵌入式项目中的辅助开发_彭树林
  10. 【JAVA】的内部类详解