join
package com.thread.demo.base;
/*** join方法的使用:* 作用: 让其主线程等待子线程完成后再执行* @author Administrator**/
public class ThreadJoin {public static void main(String[] args) {System.out.println("main thread start");Thread t1 = new Thread(new MyRunnable(),"AAA");Thread t2 = new Thread(new MyRunnable(),"BBB");t1.start();t2.start();try {t1.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("main thread end");}static class MyRunnable implements Runnable {public void run() {for (int i = 0; i< 5; i++) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"执行中.....");}}}
}

守护线程
package com.thread.demo.base;import java.io.IOException;/*** 测试守护线程* 作用: 为其非守护线程提供服务* @author Administrator**/
public class ThreadDaemon {public static void main(String[] args) {System.out.println("mian Thread start");Thread t1 = new Thread(new MyRunnable(),"AAA");t1.setDaemon(true); // 设置守护线程
        t1.start();Thread t2 = new Thread(new MyRunnable1(),"BBB");t2.start();/*try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}*/// I/O阻塞try {System.out.println("请输入内容:");System.in.read();} catch (IOException e) {e.printStackTrace();}System.out.println("main thread end!");}static class MyRunnable implements Runnable {public void run() {while(true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"执行GC操作准备....");}}}static class MyRunnable1 implements Runnable {public void run() {for(int i = 0; i < 5; i++) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"执行录屏....");}}}
}

线程礼让

package com.thread.demo.base;/*** 线程礼让* @author Administrator**/
public class ThreadYield {public static void main(String[] args) {Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {for ( int i = 0; i < 5; i++) {System.out.println(Thread.currentThread().getName()+"执行"+i);}}},"AAA");Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {for ( int i = 0; i < 5; i++) {System.out.println(Thread.currentThread().getName()+"执行"+i);if (i==0) {System.out.println("t1礼让了t2执行");t1.yield();}}}},"BBB");// 启动线程
        t1.start();t2.start();// t1让t2执行
    }
}

线程优化级
package com.thread.demo.base;/*** 线程优化级: 提供线程优于其他线程执行的几率* @author Administrator**/
public class ThreadPriority {public static void main(String[] args) {// 创建2个线程Thread t1 = new Thread(new MyRunnable(),"AAA");Thread t2 = new Thread(new MyRunnable1(),"BBB");// 设置线程优化级
        t1.setPriority(Thread.MIN_PRIORITY);t2.setPriority(Thread.MAX_PRIORITY);// 启动线程
        t1.start();t2.start();}static class MyRunnable implements Runnable {public void run() {for(int i = 0; i < 5; i++)  {/*try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}*/System.out.println(Thread.currentThread().getName()+"执行GC操作准备....");}}}static class MyRunnable1 implements Runnable {public void run() {for(int i = 0; i < 5; i++) {/*try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}*/System.out.println(Thread.currentThread().getName()+"执行录屏....");}}}
}

线程安全问题

package com.thread.demo.safe;
/*** 线程安全问题: 多个线程共享同一个资源导致* @author Administrator**/
public class ThreadSafe1 {public static void main(String[] args) {// 创建3个卖票窗口MyThread t1 = new MyThread("窗口1");MyThread t2 = new MyThread("窗口2");MyThread t3 = new MyThread("窗口3");t1.start();t2.start();t3.start();}static class MyThread extends Thread {private static int count = 10;public MyThread(String name) {super(name);}@Overridepublic void run() {while(count > 0) {String tname = Thread.currentThread().getName();System.out.println(tname+count);// 1,2 count = 1try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}tname = Thread.currentThread().getName();System.out.println(tname+"卖出了"+(count--)+"票");}}}
}

package com.thread.demo.safe;
/*** 线程安全问题: 多个线程共享同一个资源导致* @author Administrator**/
public class ThreadSafe2 {private static int count;public static void main(String[] args) {Thread t1 = new Thread(new MyRunnable());Thread t2 = new Thread(new MyRunnable());t1.start();t2.start();try {t1.join();t2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("count="+count);}static class MyRunnable implements Runnable {@Overridepublic void run() {for (int i = 0; i < 10000000; i++) {count++;}}}
}

同步块
package com.thread.demo.safe.sync;/*** 使用同步块解决线程安全的问题* @author Administrator**/
public class SyncBlock {private static SyncBlock lock = new SyncBlock();private static int count;public static void main(String[] args) {Thread t1 = new Thread(new MyRunnable());Thread t2 = new Thread(new MyRunnable());t1.start();t2.start();try {t1.join();t2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("count="+count);}static class MyRunnable implements Runnable {@Overridepublic void run() {for (int i = 0; i < 10000000; i++) {// synchronized 保证在同一个时间段中不能有其他线程同时执行synchronized(lock) {count++;}}}}
}

同步关键字
package com.thread.demo.safe.sync;/*** 使用同步关键字加锁对象的实例方法* @author Administrator**/
public class SyncInstance {private static int count;public static void main(String[] args) {MyRunnable target = new MyRunnable();Thread t1 = new Thread(target);Thread t2 = new Thread(target);t1.start();t2.start();try {t1.join();t2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("count="+count);}static class MyRunnable implements Runnable {/*** 对count操作的实例方法*/public synchronized void increse() {count++;}@Overridepublic void run() {for (int i = 0; i < 10000000; i++) {increse();}}}
}

Class类锁
package com.thread.demo.safe.sync;/*** 使用同步关键字加锁Class对象* @author Administrator**/
public class SyncClass {private static int count;public static void main(String[] args) {Thread t1 = new Thread(new MyRunnable());Thread t2 = new Thread(new MyRunnable());t1.start();t2.start();try {t1.join();t2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("count="+count);}static class MyRunnable implements Runnable {/*** 对count操作的类方法*/public static synchronized void increse() {count++;}@Overridepublic void run() {for (int i = 0; i < 10000000; i++) {increse();}}}
}

转载于:https://www.cnblogs.com/sunBinary/p/10540878.html

线程常用方法,线程安全和同步锁相关推荐

  1. 020.day20 线程概述 多线程优缺点 线程的创建 线程常用方法 生命周期 多线程同步...

    目录 多线程 一.线程概述 四.线程常用方法 多线程 一.线程概述 1. 进程 正在执行的应用程序(java.exe),一个可执行的程序一次运行的过程 独立性:不同进程之间相互独立 动态性:是一直活动 ...

  2. 抽象类java启动线程_java 线程复习笔记

    1. 线程基本概念 1.1 线程与进程 当一个程序进入内存运行时,即变成一个进程.进程是系统进行资源分配和调度的一个独立单元. 线程是进程的组成部分,一个进程可以拥有多个线程,一个线程必须有一个父进程 ...

  3. java线程池的面试题_献给准备面试的你,Java线程and线程池面试题小结

    最近这几天一直在整理Java相关的面试题,"金九银十"是求职的最佳时间,但是现在的"银十"也已经过去了一半的时间,相信现在还在为面试四处奔波的小伙伴已经很疲惫了 ...

  4. java同步锁售票_Java基础学习笔记: 多线程,线程池,同步锁(Lock,synchronized )(Thread类,ExecutorService ,Future类)(卖火车票案例)...

    学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程:线程是 ...

  5. Python之路 34:并发与并行、锁(GIL、同步锁、死锁与递归锁)、信号量、线程队列、生消模型、进程(基础使用、进程通信、进程池、回调函数)、协程

    内容: 同步锁 死锁.递归锁 信号量和同步对象(暂时了解即可) 队列------生产者和消费者模型 进程(基础使用.进程通信.进程池.回调函数) 协程 一.并发并行与同步异步的概念 1.1.并发和并行 ...

  6. java_关于线程常用操作及同步锁

    线程API: 常用构造器: 常用方法: 线程调度: 守护线程: 其他堵塞的两个方法 同步锁: 等待阻塞 线程API: 常用构造器: Thread(Runnable r)创建一个指定任务的线程对象Thr ...

  7. P576线程P582多线程P583startP584Runnable创建线程P58子线程应用P587退出P588方法P591守护线程P592线程7大状态P593同步P594互斥锁P596释放锁P598

    576线程-P598作业2 P576线程 P582多线程机制 public class Thread01 {public static void main(String[] args) {//创建Ca ...

  8. 同步锁-线程安全问题解决方案

    1 同步锁 1.1 前言 经过前面多线程编程的学习,我们遇到了线程安全的相关问题,比如多线程售票情景下的超卖/重卖现象. 上节笔记点这里-进程与线程笔记 我们如何判断程序有没有可能出现线程安全问题,主 ...

  9. Java线程:线程的同步与锁

    一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. public  ...

最新文章

  1. Linux用户必须知道的常用终端快捷键
  2. 【LeetCode】5.最长回文子串
  3. 人脸识别代码_Python人脸识别源代码可自动识别出年龄、性别等
  4. 人工智能泰斗迈克尔·乔丹分享机器学习要义:创新视角,直面挑战
  5. python中八进制_在Python中以八进制格式输入数字
  6. 计算机语言学家,著名计算语言学家冯志伟为人文学院师生作专题讲座
  7. linux系统切换清华源(自带的源下载速度太拉跨)
  8. python 位运算符与逻辑运算符(字符串的逻辑运算)
  9. LINUX7安装APACHE
  10. IAR教程之IAR安装
  11. html原生js请求
  12. 影评分析第3篇 上映4天,票房7.4亿的《海王》,用数据看大片!
  13. 详细教程:在电脑上安装linux系统
  14. Ckplayer视频播放器使用方法介绍
  15. 电脑屏幕为什么没有手机屏幕清晰?
  16. Web Dynpro for ABAP ( 四 ) BPM系统的连接
  17. 将.ipynb文件转换为.py文件
  18. 小功能⭐️Unity动态更改 Scripting Define Symbols (宏定义)
  19. 乐理入门: 二、时值、节奏、节拍
  20. php微信授权ajax,ajax 实现微信网页授权登录

热门文章

  1. 服务器上tomcat修改内存,修改Tomcat运行内存
  2. 【建站系列教程】3.2、ajax使用精讲
  3. latex下IEEE模板中嵌套Python代码
  4. php图片编辑失真,PHP上传真彩图片缩略图质量失真解决方法
  5. comsat java_java-com.thoughtworks.xstream.converters.ConversionExce...
  6. 怎么调用获取被创建的预制体_Uber 开源 Plato:扩展性极强的开发测试会话 AI 平台,可实现多智能体并行训练...
  7. linux cpu漏洞,【图片】为什么linux mint上cpu漏洞直到现在也没完全修复?_linux吧_百度贴吧...
  8. [k8s] 第六章 Pod控制器详解(Controller-manager)
  9. Spring Boot 2.3 中开启Spring Security
  10. Jvm 系列(二):Jvm 内存结构