java中多线程 - 多线程中的基本方法
介绍一下线程中基本的方法使用
线程睡眠sleep()
Thread.sleep(毫秒);我们可以通过sleep方法设置让线程睡眠。可以看到sleep是个静态方法
public static native void sleep(long var0) throws InterruptedException;
try {System.out.println(new Date().getSeconds());Thread.sleep(5000);System.out.println(new Date().getSeconds());} catch (InterruptedException e) {e.printStackTrace();}
setDaemon守护线程
非守护线程停止,那么守护线程自动退出
public static void main(String[] args) {Thread thread1 = new Thread() {@Overridepublic void run() {super.run();for(int i = 0; i < 5; i ++) {System.out.println("非守护线程");}}};Thread thread2 = new Thread() {@Overridepublic void run() {for(int i = 0; i < 200; i ++) {System.out.println("守护线程");}}};thread2.setDaemon(true);thread1.start();thread2.start();}
可以很明显的看到thread2本应该执行200次输出,但是这里只输出了几行。因为当thread1执行完毕后,thread2作为守护线程就自动停止了。
多线程join
如果执行了join方法,那么停止当前线程,先跑执行了join()的线程。相当于插队执行。如下,在执行thread2线程的时候,如果i==20的时候,则让thread1插队先执行
public static void main(String[] args) {final Thread thread1 = new Thread() {@Overridepublic void run() {super.run();for(int i = 0; i < 500; i ++) {System.out.println("thread1---" + i);}}};Thread thread2 = new Thread() {@Overridepublic void run() {for(int i = 0; i < 200; i ++) {if (i == 20) {try {//插队执行thread1.join();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(i);}}};thread1.start();thread2.start();}
join()方法也可以传参数long 毫秒 join(毫秒)
表示让执行join的线程,插队执行XXX毫秒,过了时间后,两个线程交替执行
public static void main(String[] args) {final Thread thread1 = new Thread() {@Overridepublic void run() {super.run();for(int i = 0; i < 500; i ++) {System.out.println("thread1---" + i);}}};Thread thread2 = new Thread() {@Overridepublic void run() {for(int i = 0; i < 200; i ++) {if (i == 20) {try {//插队执行1毫秒thread1.join(1);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(i);}}};thread1.start();thread2.start();}
yeild 礼让线程
yeild会让出cpu,让其他线程执行
public static void main(String[] args) {final Thread thread1 = new Thread() {@Overridepublic void run() {super.run();for(int i = 0; i < 500; i ++) {System.out.println( getName() + "---" + i);}}};Thread thread2 = new Thread() {@Overridepublic void run() {for(int i = 0; i < 200; i ++) {if (i % 5 == 0) {Thread.yield();}System.out.println(getName() + "---" + i);}}};thread1.start();thread2.start();}
setPriority给线程设置优先级
默认优先级是5 最小1,最大10
越大优先级越高
public static void main(String[] args) {final Thread thread1 = new Thread() {@Overridepublic void run() {super.run();for(int i = 0; i < 500; i ++) {System.out.println( getName() + "---" + i);}}};Thread thread2 = new Thread() {@Overridepublic void run() {for(int i = 0; i < 500; i ++) {System.out.println(getName() + "---" + i);}}};//设置最大的线程优先级最大为10thread1.setPriority(Thread.MIN_PRIORITY);//设置最小的线程优先级,最小为1thread2.setPriority(Thread.MAX_PRIORITY);thread1.start();thread2.start();}
synchronized
同步代码块
当多线程并发,多段代码同时执行的时候。希望在执行其中代码的时候,cpu不切换线程
不用synchronized的情况
我们来看一下不用synchronized的情况会发生什么
public class ThreadSynchronied {public static void main(String[] args) {final Say say = new Say();Thread thread1 = new Thread() {@Overridepublic void run() {for (int i = 0 ; i < 10000 ; i ++) {say.say();}}};Thread thread2 = new Thread() {@Overridepublic void run() {for (int i = 0 ; i < 10000 ; i ++) {say.say1();}}};//设置最大的线程优先级最大为10thread1.setPriority(Thread.MIN_PRIORITY);//设置最小的线程优先级,最小为1thread2.setPriority(Thread.MAX_PRIORITY);thread1.start();thread2.start();}
}class Say {void say() {System.out.print("s ");System.out.print("a ");System.out.print("y ");System.out.print("h ");System.out.print("e ");System.out.print("l ");System.out.print("l ");System.out.println("o");}void say1() {System.out.print("1 ");System.out.print("2 ");System.out.print("3 ");System.out.print("4 ");System.out.print("5 ");System.out.print("6 ");System.out.print("7 ");System.out.println("8");}
}
我们发现有些输出并没有打印全,在执行线程thread1的过程中,cpu被thread2抢占。这种情况下,肯定是不符合我们的业务逻辑的。所以我们要保证线程执行了一个完整的方法后,cpu才会被其他线程抢占
使用synchronized
public class ThreadSynchronied {public static void main(String[] args) {final Say say = new Say();Thread thread1 = new Thread() {@Overridepublic void run() {for (int i = 0 ; i < 10000 ; i ++) {say.say();}}};Thread thread2 = new Thread() {@Overridepublic void run() {for (int i = 0 ; i < 10000 ; i ++) {say.say1();}}};//设置最大的线程优先级最大为10thread1.setPriority(Thread.MIN_PRIORITY);//设置最小的线程优先级,最小为1thread2.setPriority(Thread.MAX_PRIORITY);thread1.start();thread2.start();}
}class Say {String s = "hahaah";void say() {synchronized (s) {System.out.print("s ");System.out.print("a ");System.out.print("y ");System.out.print("h ");System.out.print("e ");System.out.print("l ");System.out.print("l ");System.out.println("o");}}void say1() {synchronized (s) {System.out.print("1 ");System.out.print("2 ");System.out.print("3 ");System.out.print("4 ");System.out.print("5 ");System.out.print("6 ");System.out.print("7 ");System.out.println("8");}}
}
使用synchronized同步代码块后,就发现不会出现上述情况了
同步方法
public class ThreadSynchroniedMethod {public static void main(String[] args) {final Say say = new Say();Thread thread1 = new Thread() {@Overridepublic void run() {for (int i = 0 ; i < 10000 ; i ++) {say.say();}}};Thread thread2 = new Thread() {@Overridepublic void run() {for (int i = 0 ; i < 10000 ; i ++) {say.say1();}}};//设置最大的线程优先级最大为10thread1.setPriority(Thread.MIN_PRIORITY);//设置最小的线程优先级,最小为1thread2.setPriority(Thread.MAX_PRIORITY);thread1.start();thread2.start();}
}class Say {//在方法上加锁static synchronized void say() {System.out.print("s ");System.out.print("a ");System.out.print("y ");System.out.print("h ");System.out.print("e ");System.out.print("l ");System.out.print("l ");System.out.println("o");}static void say1() {synchronized (Say.class) {System.out.print("1 ");System.out.print("2 ");System.out.print("3 ");System.out.print("4 ");System.out.print("5 ");System.out.print("6 ");System.out.print("7 ");System.out.println("8");}}
}
同步方法指的就是在方法上加锁
静态同步方法的所对象是该类的字节码对象
非静态的同步方法锁对象是this
多个线程使用同一资源锁,容易造成死锁
什么是死锁?
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
线程安全类
Vector
StringBuffer
HashTable
线程不安全
ArrayList
StringBuilder
HashSet
java.util.Collections中有synchronizedList等方法,支持我们把线程不安全的集合转成线程安全的
学习笔记
多次启动一个线程是非法的
转载于:https://www.cnblogs.com/amberbar/p/9696440.html
java中多线程 - 多线程中的基本方法相关推荐
- java socket建立长连接_Java Web项目中使用Socket通信多线程、长连接的方法
很多时候在javaweb项目中我们需要用到Socket通信来实现功能,在web中使用Socket我们需要建立一个监听程序,在程序启动时,启动socket监听.我们的应用场景是在java项目中,需要外接 ...
- java join yield_Java多线程中join、yield、sleep方法详解
在Java多线程编程中,Thread类是其中一个核心和关键的角色.因此,对该类中一些基础常用方法的理解和熟练使用是开发多线程代码的基础.本篇主要总结一下Thread中常用的一些静态方法的含义及代码中的 ...
- JAVA中的多线程(八):线程的优先级和yield方法
JAVA中的多线程(八):线程的优先级和yield方法 优先级代表着抢资源的频率 所有线程默认优先级是5 yield()临时释放线程的执行权 1 class Demo implements Runna ...
- Java基础_17 | Java多线程程序设计(Java中两种创建线程的方法、多线程之间的同步和互斥)
1. 多线程实现最核心的机制 一个程序在其执行过程中, 可以产生多个线程, 形成多条执行线索.,每条线程,有产生.存在和消亡的过程,并且独立完成各自的功能,互不干扰. 多线程程序运行只占用一个CPU, ...
- java多线程同步的四种方法_java中实现多线程的两种方法
java多线程有几种实现方法,都是什么?同步有几种实java中多线程的实现方法有两种:1.直接继承thread类:2.实现runnable接口:同步的实现方法有五种:1.同步方法:2.同步代码块:3. ...
- Java中的多线程总结
多线程:指的是一个应用程序中有多条并发执行的线索,每条线索都被称作一个线程,他们会交替执行,彼此间可以进行通信. 进程:就是一个运行的程序.所有的进程都是由CPU执行,对于一个CPU而言,在某个时间点 ...
- Java中的多线程编程(超详细总结)
文章目录 Java中的多线程编程(超详细总结) 一.线程与多线程的概念 二.线程与进程之间的关系 三.一个线程的生命周期 四.多线程的目的和意义 五.线程的实现的方式 Java中的多线程编程(超详细总 ...
- 一篇博客带你轻松应对java面试中的多线程与高并发
1. Java线程的创建方式 (1)继承thread类 thread类本质是实现了runnable接口的一个实例,代表线程的一个实例.启动线程的方式start方法.start是一个本地方法,执行后,执 ...
- JAVA中的多线程(一)
JAVA中的多线程(一) 进程:是一个正在执行中的程序 每一个进程执行都有一个执行的顺序,该顺序是一个执行路径,或者叫控制单元 线程:就是进程中的一个独立的控制单元 线程在控制着进程的执行 一个进程中 ...
- Java 程序中的多线程
在 Java 程序中使用多线程要比在 C 或 C++ 中容易得多,这是因为 Java 编程语言提供了语言级的支持.本文通过简单的编程示例来说明 Java 程序中的多线程是多么直观.读完本文以后,用户应 ...
最新文章
- 企业网络推广下的B站二次上市:致力于造就国内最具活力和创造力的内容社区...
- 企业“数据压力锅”即将爆炸,CIO该如何防止爆锅?
- python用map提取一个数的个十百位数_如何使用python中的map函数?
- mysql 导入dmp_mysql导入导出sql文件
- 业务逻辑全写在sql_12306的业务逻辑很复杂么?一条SQL语句搞不定?
- My97DatePicker 组件使用方法---My97DatePicker
- Linux入门相关基础知识
- 成都KTV点歌类小程序开发公司,微信小程序开发
- 关于微信公众号和小程序开发杂谈~快速认证小程序
- Failure [INSTALL_FAILED_INVALID_APK]
- java经典题丨有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总对数为多少?
- Mybatis(一) 主配置文件
- 西安财经大学“荣耀杯”迷你马拉松——微博营销方案
- 微信小程序页面栈超过【10层】之后无法打开其他页面原因
- Robcup2D足球学习记录【2020.01.18】
- (海伦公式)已知三角形三条边长,求面积
- 常见七种逻辑门真值表
- pyecharts-page的组合
- 悼念一位腾讯游戏大佬。。
- drf框架使用之 路飞学城(第一天)
热门文章
- 卷积神经网络(CNN)详解及TensorFlow2代码实现
- 多线程 全局变量_python高级:6.多线程part1
- java什么是原生类_Java 基础 - 原生类型
- rstudio运行python_RStudio 1.2发布,改进对Python chunks,R脚本等的测试和支持
- python控制手机自动刷新闻_python +adb控制手机自动化签到
- springboot2.x 与 elasticsearch2.4.x整合出错:None of the configured nodes are available
- spring mail 发送邮件
- 基于安卓手机的辅助驾驶APP开发
- linux应用之--网络编程
- 【IT笔试面试题整理】数组中出现次数超过一半的数字