线程的基本知识

简介: 【线程的概念】Thread--->线程类一:程序,进程,线程的基本区别  进程:作为资源的分配单位。  线程:调度和执行的单位。       (1)程序:指令集。【静态的】       (2)进程:操作系统cpu调度程序。

【线程的概念】
Thread--->线程类
一:程序,进程,线程的基本区别  进程:作为资源的分配单位。  线程:调度和执行的单位。
       (1)程序:指令集。【静态的】
       (2)进程:操作系统cpu调度程序。【动态】在内存中分配独立的内存空间
       (3)线程:一个进程中的一个执行路径
二:【进程】
(1)进程是程序的一次动态执行过程,占用特定的地址空间。
(2)每个进程都是独立的,有三部分组成,占有--->cpu【占有cpu的调度】
                                                                                       --->date【数据】
                                                                                       --->code【代码】
(3)缺点:占有cup,浪费内存空间
(4)多进程:就是操作系统同时运行多个程序,如QQ,优酷视频,百度网页
       
三:cpu调度 ---->cpu是解释运行进程的
                    ---->cpu是以【时间片】的单位在操作系统中所有进程间互相进行切换。当从a进程切换到b进程,a进程执行挂起,等cpu再次切换回来,从挂起点继续往下执行。
                   ----->【时间片】很短的时间,纳秒。正因为短,所以在我们看来,所有进程是同步的。
【线程】
       ---->(1)是模拟进程的。多线程是一个进程中拥有多条执行路径。每一个线程可以看成 [轻量级的进程], 而 [jvm] 就是模拟 [cpu] 在不同线程中间进行切换,解释执行线程内的代码。
       ----->(2)一个进程中可以有多个并行线程。每个线程是独立的。
       ----->(3)一个进程中的多个线程共享内存单元/内存地址空间。-->访问相同的变量和对象,从同一个堆中分配对象(通信,数据交换,同步操作)【多线程的并发问题】
       ----->(4)多线程是一个进程中有多个执行流。
【使线程阻塞】
               一:join():合并。比如说当运行到ti.join()。ti的线程将霸占cpu调度权,直到执行结束。
               二:static yield()-->那个线程调用此方法,那个线程暂时一次让出CPU调度权。至于能否暂停,实际看cpu是否去掉别的线程。我主动放弃一次,至于cpu走不走,看cpu的。
               三:static sleep(long a)--->1 模拟倒计时
                                                                    2 模拟网络延时
                                                       那个线程调用sleep(),该线程休眠的同时,让出cpu使用权,进入阻塞状态,直到休眠时间结束,进入就绪状态,等待cpu调度。
【线程优先级】
(1)setPriority(int )--->设置线程优先级。优先级,不代表优先运行,而是获得CPU调度权的概率大小。
                tr.setPriority(tr. MAX_PRIORITY ); //将tr线程设为最高优先级int =10
               tr.setPriority(tr. MIN_PRIORITY ); //将tr线程设为最低优先级--int=1
               tr.setPriority(tr. NORM_PRIORITY ); //将tr线程设为默认优先级--int=5
(2)isAlive()----》判断线程的状态。线程活着返回true   线程死了返回 false
 (3) currentThread () --->返回当前线程对象。  读音:可 瑞特 色润得-->cur rent  Thread
 (4)getName ()--->返回线程的名字   Thread.currentThread().getName()返回当前线程的名字。

 

【线程的创建启动】

第一种方法: A创建线程 --->让 线程类 去继承Thread类,并重写run()方法
                                       --->run()方法内写逻辑代码--->称之为线程体
                                       --->run()方法相当与main()方法,线程入口点。
                       
                        B使用线程 --->创建类的对象,对象.start()--<线程的启动>等待cup调用解释运行。
                                       ----->不能调用run方法,如果调用run方法,那就是等于调动普通方法。
第二种方法:A创建线程--->让线程类去实现接口Runnable,并重写run()方法
                                       ----->run()方法内写逻辑代码--->称之为线程体
                       B启动线程--->创建真实角色--->创建线程类对象
                                       ----->创静态代理角色--->Thread bb=new Thread(Runnable a);
                                       ----->让代理角色.start()启动线程。例子 bb.start();
第二种方法线程--->实现了线程实现和线程声明的分离。
推荐使用第二种方法使用线程
       原因1)避免单继承
               2)共享资源
静态代理模式。
1)真实角色
2)代理角色 +持有真实角色的引用
3)二者实现相同的接口
                                      

【线程的状态】

【线程的状态】 【新生状态】---> 创建Thread对象。或Thread类的子类对象。新生状态的线程有自己的内存空间。
                          【就绪状态】---> 线程对象.start();等待分配到cpu或者 失去cpu使用权的状态
                            【运行状态】---> jvm或cpu正在运行线程内代码,自上而下。
                            【阻塞状态】---> 运行中时,碰到sleep();或等待IO设备等资源等一些原因,使其暂时让出cpu使用权,进入阻塞状态,等唤醒或IO设备空闲,则进入就绪状态,等待分配cpu。或者是线程休眠。wait();
                            【死亡状态】---> 线程中代码执行完毕正常死亡,或强制死亡,执行中途碰到stop或destroy方法(不建议使用这两个方法,前者产生异常,后者强制终止,不会释放锁)

【使线程阻塞】
               一:join():合并。比如说当运行到ti.join()。ti的线程将霸占cpu调度权,直到执行结束。
               二:static yield()-->那个线程调用此方法,那个线程暂时一次让出CPU调度权。至于能否暂停,实际看cpu是否去掉别的线程。我主动放弃一次,至于cpu走不走,看cpu的。
               三:static sleep(long a)--->1 模拟倒计时
                                                                    2 模拟网络延时
                                                       那个线程调用sleep(),该线程休眠的同时,让出cpu使用权,进入阻塞状态,直到休眠时间结束,进入就绪状态,等待cpu调度。
三、阻塞
1、join :合并线程
2、yield:暂停自己的线程   static
3、sleep:休眠,不释放锁
 1)、与时间相关:倒计时
 2)、模拟网络延时

 

【多线程同步】

一:同步线程---->是为了解决多个线程同时访问同一资源,发生的并发问题。
二:synchronized关键字
A同步方法--->在方法前加上 synchronized 关键字修饰,表示方法线程安全。public synchronized void add(int a){}--->表示此方法线程安全。
        比如说:a,b,c线程访问同一资源时。
       当多线程访问同一资源时,a线程获得cpu调度运行到此方法时,a线程锁住cpu调度权,直到cpu解释运行完此方法,才恢复cpu调度权的自由切换。
B同步块
synchronized(对象|类.class|this){------>syn ch ro ni zed
       容易出现并发的代码块
}
       锁住范围过小线程不安全
       锁住范围过大降低线程效率
       锁的对象不对,线程不安全
       锁的范围不对,线程不安全

 

【线程死锁】

【死锁】---->多线程。过多的同步容易造成死锁。不是一定会造成死锁。
如果多个线程,同时操作同一份资源,而线程体内存在过个同步(同步方法和同步块),会容易造成并发问题。也就是死锁

 

相关文章
|
5月前
|
安全 API 调度
深度剖析:Python并发编程中的线程与进程,那些你不可不知的使用技巧与限制!
【7月更文挑战第9天】Python并发:线程适合IO密集型任务,利用GIL下的多线程同步,如示例中使用锁。进程适用于CPU密集型,通过multiprocessing模块实现多进程,利用进程间通信如队列。线程受限于GIL,进程间通信成本高。选择取决于任务需求和性能目标。
39 2
|
存储 Linux 调度
Linux系统编程5(线程概念详解)
Linux系统编程5(线程概念详解)
230 0
|
安全 Java 调度
【并发编程】线程的基础知识篇
【并发编程】线程的基础知识篇
|
缓存 安全 Java
线程基础知识总结
@[toc] 1. 认识线程(Thread) 1.1 概念 1.2 创建线程 1.2.1 方法1 继承Thread类 1.2.2 方法2 实现Runnable接口 1.2.3 实现 Callable 接口,使用 FutureTask 接收线程返回值 1.2.4 对比上面两种方法 2. Thread类及常见方法 2.1 Thread的常见构造方法 2.2 Thread的几个常见属性 2.3 启动一个线程-start() 2.4 中断一个线程 2.5 等待一个线程-join() 2.6 获取当前线程的引用 2.7 休眠当前线程 3. 线程的状态 3.1 线程的所有状态 3.2 线程各状态之间的转移
61 0
|
安全 Java 调度
Java多线程(1)--基本概念:程序、进程、线程
Java多线程(1)--基本概念:程序、进程、线程
152 0
Java多线程(1)--基本概念:程序、进程、线程
|
存储 缓存 监控
Java并发编程系列之二线程基础
上篇文章对并发的理论基础进行了回顾,主要是为什么使用多线程、多线程会引发什么问题及引发的原因,和怎么使用Java中的多线程去解决这些问题。
Java并发编程系列之二线程基础
|
Unix 调度 C++
认识进程(多线程_初阶)
认识进程(多线程_初阶)
158 0
认识进程(多线程_初阶)
|
缓存 监控 Java
【Java并发编程系列7】线程池基本知识
目前书籍《Java并发编程实战》看到“第7章:取消与关闭”,里面涉及到部分线程池的内容,然后第8章就是线程池,所以打算把之前看的线程池的资料再整理一下,便于后面能更好理解书中的内容。 之前看过一篇博客,关于线程池的内容讲解的非常好,我只截取基础知识部分,把Java基础内容全部掌握后,再对里面的原理部分进行深入理解,后面会附上该篇博客的链接。
141 0
【Java并发编程系列7】线程池基本知识
|
资源调度 Java 程序员
线程基础知识
计算机系统里每个进程(Process)都代表着一个运行着的程序,进程是对运行时程序的封装,系统进行资源调度和分配的基本单位。 一个进程下可以有很多个线程,线程是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发,线程同时也是操作系统可识别的最小执行和调度单位。 在 Java 里线程是程序执行的载体,我们写的代码就是由线程运行的。有的时候为了增加程序的执行效率,我们不得不使用多线程进行编程,虽然多线程能最大化程序利用 CPU 的效率,但也是程序事故多发、程序员脱发的最大诱因。主要是平时我们的思维默认是单线程的,写多线程的时候得可以切换一下才行。
116 0
|
安全
初识线程基本知识
初识线程基本知识
165 0