1.0 高并发之线程和进程
一、多线程
1、1 线程与进程区别
进程:每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。
线程:线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。
总结:进程是所有线程的集合,每一个线程是进程中的一条执行路径。多线程的好处是可以提高程序的效率。
一个应用系统可以多个进程:进程中一定有一个主线程(java中main函数)。线程是一个进程执行顺序,流程,路径,并且每个线程不影响。
1、2 生活中实例:
迅雷种子多个下载,买票系统,应用系统,ajax异步上传。
1、3 实现多线程的方式
同步执行:单线程(同一时刻只能执行一个方法,时间相加)
异步执行:多线程(同一时刻同时执行多个方法,不相互影响,时间随最后执行完时间结束)
实现runnable接口比继承thread类好,因为接口可以多继承。
开始执行线程 开启线程不是调用run方法,而是start方法
创建方法: 1、第一种继承thread类 重写run方法、范例代码:注意 开启线程不是调用run方法,而是start方法
package com.lele.javaall1203test;
/**
* @author liule
* @version v0.1
* @classdesc 创建多线程例子(重写thread的run方法)
*/
class createthrea extends thread{
public void run(){
for( int i = 0;i<=200;i++){
system.out.println("i的值为"+i);
}
}
}
public class test01threath {
public static void main(string[]args){
system.out.println("多线程createthread开始");
createthrea t = new createthrea();
system.out.println("开始执行多线程");
t.start();
for( int i = 0;i<=200;i++){
system.out.println("main"+i);
}
system.out.println("多线程createthread结束");
}
}
2、实现runnable接口,重写run方法,代码范例
/**
* @author liule
* @version v0.1
* @classdesc 创建多线程例子(实现runnable接口)
*/
public class test02runnable {
public static void main(string[]args){
system.out.println("创建一个多线程---");
creatrunnable c = new creatrunnable();
system.out.println("多线程开始调用---");
thread thread = new thread(c);
thread.start();
for(int i = 0 ; i <= 200 ;i++ ){
system.out.println("i的主方法的值为"+i);
}
system.out.println("多线程调用结束--");
}
}
class creatrunnable implements runnable{
@override
public void run(){
for(int i = 0 ; i <= 200 ;i++ ){
system.out.println("i的子线程值为"+i);
}
}
}
3、使用匿名内部类
public class test03innoname {
public static void main(string[]args){
system.out.println("多线程开始");
thread thread = new thread(new runnable() {
@override
public void run() {
for ( int i = 0; i < 20;i++){
system.out.println("内部子线程i"+i);
}
}
});
thread.start();
for ( int i = 0; i < 20;i++){
system.out.println("内部主线程i"+i);
}
}
}
线程常用api的方法:
start()启动线程
currentthread()获取当前线程对象
getid()获取当前线程id thread-编号 该编号从0开始
getname()获取当前线程名称
sleep(long mill)休眠线程
stop()停止线程,(不安全,已不使用)
二、守护线程
java中有两种线程,一种是用户线程(非守护线程,用户线程是指用户自定义创建的线程,主线程停止,用户线程不会停止)
另一种是守护线程(和主线程一起销毁gc回收线程)。守护线程当进程不存在或主线程停止,守护线程也会被停止。
使用setdaemon(true)方法设置为守护线程
三、多线程状态
线程从创建、运行到结束总是处于下面五个状态之一:新建状态(ew thread(r))、就绪状态(start()方法)、运行状态(真正开始执行run()方法)、
阻塞状态 线程运行过程中,可能由于各种原因进入阻塞状态:
1>线程通过调用sleep方法进入睡眠状态;
2>线程调用一个在i/o上被阻塞的操作,即该操作在输入输出操作完成之前不会返回到它的调用者;
3>线程试图得到一个锁,而该锁正被其他线程持有;
4>线程在等待某个触发条件;
死亡状态,需要使用isalive方法
1) run方法正常退出而自然死亡,
2) 一个未捕获的异常终止了run方法而使线程猝死。
四、join方法
join作用是让其他线程变为等待,
t1.join();// 让其他线程变为等待,直到当前t1线程执行完毕,才释放。
thread.join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程b中调用了线程a的join()方法,直到线程a执行完毕后,才会继续执行线程b。join方法写在相应的下一个执行的方法中。
上一篇: 分布式锁探讨
推荐阅读
-
java高并发系列 - 第10天:线程安全和synchronized关键字
-
python爬虫之线程池和进程池功能与用法详解
-
1.0 高并发之线程和进程
-
《C#并发编程经典实例》学习笔记-进程(process)和线程(thread)
-
Java并发编程:进程和线程之由来
-
Java 并发包之线程池和原子计数 ThreadPooljava线程池并发包Java计数
-
【2020Python修炼记】python并发编程(六)补充—进程池和线程池
-
基础篇:高并发一瞥,线程和线程池的总结
-
【JUC多线程与高并发】多线程进阶,性能优化之锁优化
-
python 之 并发编程(守护线程与守护进程的区别、线程互斥锁、死锁现象与递归锁、信号量、GIL全局解释器锁)