2019独角兽企业重金招聘Python工程师标准>>>

Java多线程编程总结

线程基础:

当创建线程时,会为非static对象各自申请内存空间

卖票程序:

线程的优先级用1-10之间的整数表示,数值越大优先级越高,默认的优先级为5。

pupublic class Main {static int ticket = 10;static Runnable mRunnable = new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubwhile (true) {synchronized (this) {if (ticket > 0) {try {Thread.sleep(1000);System.out.println(Thread.currentThread().getName()+ "卖出票-->" + ticket--);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}} else {break;}}}}};public static void main(String[] args) {Thread t1 = new Thread(mRunnable, "线程, A\t");Thread t2 = new Thread(mRunnable, "线程, B\t");t1.setPriority(1);t2.setPriority(10);t1.start();t2.start();}
}

卖票程序(两线程各自有自己的票仓库)

将ticket设为non-static

public class MyThread implements Runnable {int ticket = 100;@Overridepublic void run() {// TODO Auto-generated method stubwhile (true) {synchronized (this) {if (ticket > 0) {try {Thread.sleep(10);System.out.println(Thread.currentThread().getName() + "卖出票-->" + ticket--);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}} else {break;}}}}public static void main(String[] args) {Runnable run1 = new MyThread();Runnable run2 = new MyThread();Thread t1 = new Thread(run1,"线程   A\t");Thread t2 = new Thread(run2,"线程   B\t");t1.start();t2.start();try {t1.join(); System.out.println(t1.getName() + "卖完票");t2.join();System.out.println(t2.getName() + "卖完票");} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

一个死锁案例:Java:多线程死锁

public class LockDemo implements Runnable{private static Object object1 = new Object();private static Object object2 = new Object();private int flag = 0;public static void main(String[] args) throws InterruptedException {LockDemo run0 = new LockDemo();LockDemo run1 = new LockDemo();    run0.flag = 1;    //here    run1.flag = 2;    //Thread thread1 = new Thread(run0);Thread thread2 = new Thread(run1);thread1.start();thread2.start();}@Overridepublic void run(){System.out.println(flag);if (flag == 1){synchronized (object1){System.out.println("线程 : " + flag + "锁定obj1,休息0.5秒后锁定obj2去!");try{Thread.sleep(500);}catch (Exception e){e.printStackTrace();}synchronized (object2){System.out.println("线程 : " + flag + "访问 object2");}}}if (flag == 2){synchronized (object2){System.out.println("线程 : " + flag + "锁定obj2,休息0.5秒后锁定obj1去!");try{Thread.sleep(500);}catch (Exception e){e.printStackTrace();}synchronized (object1){System.out.println("线程 : " + flag + "访问object1");}}}}
}

结果:

2线程 : 2锁定obj2,休息0.5秒后锁定obj1去!1线程 : 1锁定obj1,休息0.5秒后锁定obj2去!

对象锁、notifyAll、notify、wait

wait()方法 
在其他线程调用对象的notify或notifyAll方法前,导致当前线程等待。线程会释放掉它所占有的“锁标志”,从而使别的线程有机会抢占该锁。 
唤醒当前对象锁的等待线程使用notify或notifyAll方法,wait() 和notify()必须在synchronized函数或synchronized block中进行调用。

Calculator.java:

//计算线程
public class Calculator extends Thread {private int total;public int getTotal() {return total;}public void run() {synchronized (this) {for (int i = 0; i < 10; i++) {total += i;}// 通知所有在此对象上等待的线程notifyAll();}}
}

ReaderResult.java:

public class ReaderResult extends Thread {Calculator c;public ReaderResult(Calculator c) {this.c = c;}public void run() {synchronized (c) {try {System.out.println(Thread.currentThread() + "等待计算结果。。。");c.wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread() + "计算结果为:" + c.getTotal());}}public static void main(String[] args) {// 启动5个线程,分别获取计算结果Calculator calculator = new Calculator();for (int i = 0; i < 5; i++) {new ReaderResult(calculator).start();}// 启动计算线程calculator.start();}
}

结果:

Thread[Thread-1,5,main]等待计算结果。。。Thread[Thread-2,5,main]等待计算结果。。。Thread[Thread-3,5,main]等待计算结果。。。Thread[Thread-5,5,main]等待计算结果。。。Thread[Thread-4,5,main]等待计算结果。。。Thread[Thread-1,5,main]计算结果为:45Thread[Thread-4,5,main]计算结果为:45Thread[Thread-5,5,main]计算结果为:45Thread[Thread-3,5,main]计算结果为:45Thread[Thread-2,5,main]计算结果为:45

线程jion方法:等待该线程终止。等待调用join方法的线程结束,再继续执行。

public class Main {static class MyThread implements Runnable {@Overridepublic void run() {// TODO Auto-generated method stubfor (int i = 0; i < 5; i++) {try {Thread.sleep(1000);show("XIXI RUN->slower and slower");} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}public static void main(String args[]) {Runnable mRunnable = new MyThread();Thread t1 = new Thread(mRunnable, "xixi");t1.start();try {t1.join();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}show("MAIN RUN->CAN YOU BE FAST");}private static void show(String str) {System.out.println(str);}
}

结果:

XIXI RUN->slower and slowerXIXI RUN->slower and slowerXIXI RUN->slower and slowerXIXI RUN->slower and slowerXIXI RUN->slower and slowerMAIN RUN->CAN YOU BE FAST

转载于:https://my.oschina.net/u/660536/blog/369692

线程介绍,异步,对象锁相关推荐

  1. java线程同步以及对象锁和类锁解析(多线程synchronized关键字)

    一.关于线程安全 1.是什么决定的线程安全问题? 线程安全问题基本是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线 ...

  2. android线程作用,Android线程介绍

    进程与线程 进程:是操作系统的基础:是一次程序的执行:是一个程序及数据在处理机上顺序执行时所发生的活动:是程序在一个数据集合运动的过程:它是系统进行资源分配的一个独立单位. 线程:线程可以理解成是在进 ...

  3. 内置类和对象锁改变 笔记记录

    当内置类是私有的,若实例化该类与内置类 在一个包下可以实例化.若不在一个包下要实例化,需要将内置类改为public package com.inner; public class PublicClas ...

  4. 《八股文》细数Java线程、并发、锁,温故而知新

    <八股文>细数Java线程.并发.锁,温故而知新 基础 1. 并行.并发有什么区别? 2. 说说什么是进程和线程? 3. 说说线程有几种创建方式? 4. 为什么调用start()方法时会执 ...

  5. 对象的notify方法的含义和对象锁释放的三种情况

    1,notify的含义     (1)notify一次只随机通知一个线程进行唤醒 (2)在执行了notify方法之后,当前线程不会马上释放该对象锁,呈wait状态的线程也不能马上获得该对象锁, 要等到 ...

  6. Java 类锁、对象锁、私有锁

    3.6 Java类锁.对象锁.私有锁.隐式锁 类锁和对象锁是否会冲突?对象锁和私有锁是否会冲突?通过实例来进行说明. 一.相关约定 为了明确后文的描述,先对本文涉及到的锁的相关定义作如下约定: 1. ...

  7. Synchronize对象锁异步

    对象锁异步 A线程,先持有对象的锁 b线程,可以以异步的方式,调用对象中的非synchronize修饰的方法 package com.bjsxt.base.sync003;/*** 对象锁的同步和异步 ...

  8. wait放弃对象锁_Java线程中wait、await、sleep、yield、join用法总结

    一.wait().notify().notifyAll()用法 obj.wait()/obj.wait(long timeout)是Object中的方法,当线程调用wait()方法,当前线程释放对象锁 ...

  9. 【Java 并发编程】线程锁机制 ( 线程安全 | 锁机制 | 类锁 | 对象锁 | 轻量级锁 | 重量级锁 )

    文章目录 一.线程安全 二.锁机制 ( 类锁 | 对象锁 ) 三.锁分类 ( 轻量级锁 | 重量级锁 ) 一.线程安全 多个线程同时访问 同一个共享变量 时 , 只要能保证 数据一致性 , 那么该变量 ...

最新文章

  1. Exchange 2010安装前的准备工作
  2. zcmu-1643 报数游戏
  3. C#数组解决约瑟夫环问题
  4. upc组队赛15 Supreme Number【打表】
  5. jdk8切换成jdk6_运行中的JDK语言功能预览:切换表达式
  6. MySQL 深潜 - MDL 锁的实现与获取机制
  7. 批量更改数据库COLLATION
  8. 如果每天给你888元,只能看书学习,不能玩手机电脑,你能坚持多少天?
  9. c语言语法sc,适合于嵌入式系统的C语言单元测试框架:SCUNIT
  10. 网安学习日志(5)流量分析基础
  11. Java网络编程——UDP编程
  12. linux sybase 自动备份,sybase数据库 Linux环境下,每天定时全量备份+sybase数据库 stripe on 还原...
  13. Win7显示文件拓展名
  14. 意创坊-移动富媒体平台
  15. 卸载360企业版密码
  16. 仿写天猫tmall首页
  17. React:styled-components的使用
  18. Hadoop高频面试题(建议收藏)
  19. 微信输入法语音转文字的设计点
  20. 浅谈Android输入法(IME)架构

热门文章

  1. C#笔记 Public,Private,Protected,Internal,Protected internal
  2. git 换行符问题,统一linux风格
  3. JOOMLA中文安装时 数据库发生错误解块办法
  4. 使用苹果版博客编辑器发布的文章
  5. 3em html5,谁是最好的手机浏览器:IE9 VS Safari 5
  6. datatable数据插入mysql_DataTable 数据更新、删除、插入 数据库 操作
  7. Linux Kernel TCP/IP Stack — L1 Layer — Network Interface
  8. Netty+SpringBoot+FastDFS+Html5实现聊天App
  9. 傻瓜式操作Nagios图解
  10. A generic error occurred in GDI+的解决方案