博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程
阅读量:5058 次
发布时间:2019-06-12

本文共 2347 字,大约阅读时间需要 7 分钟。

1、线程和进程:

操作系统一般都支持同时运行多个任务,一个任务通常是一个程序,每个运行中的程序就是一个进程。当一个程序运行时,内部可能包含多个顺序执行流,每个顺序执行流就是一个线程。

进程是处于运行过程中的程序,并且具有一定的独立功能,是系统进行资源分配和调度的一个独立单位。

线程是进程的执行单元,线程在程序中是独立的、并发的执行流。多个线程间共享进程资源。

并发性:并发指在同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行

并行性:并行指在同一时刻,有多条指令在多个处理器上同时执行

2、线程的创建和启动

1)继承Thread类创建线程类

线程类不能再继承其他父类

1 public class FirstThread extends Thread { 2     public void run() { 3         for (int i = 0; i < 20; i++) { 4             System.out.println(getName() + " " + i); 5         } 6     } 7  8     public static void main(String[] args) { 9         for (int i = 0; i < 20; i++) {10             System.out.println(Thread.currentThread().getName() + " " + i);11             if (i == 4) {12                 new FirstThread().start();13                 new FirstThread().start();14             }15         }16     }17 }
View Code

2)实现Runnable接口创建线程类

线程类可以继承其他类,多个线程共享一个target对象,适合多个相同线程处理同一份资源

1 public class SecondThread implements Runnable{ 2     public void run() { 3         for (int i = 0; i < 20; i++) { 4             System.out.println(Thread.currentThread().getName() + " " + i); 5         } 6     } 7      8     public static void main(String[] args) { 9         for (int i = 0; i < 20; i++) {10             System.out.println(Thread.currentThread().getName() + " " + i);11             if (i == 4) {12                 SecondThread secondThread=new SecondThread();13                 new Thread(secondThread,"新线程1").start();14                 new Thread(secondThread,"新线程2").start();15             }16         }17     }18 }
View Code

3、生命周期

1)当使用new关键字创建一个线程后,该线程处于新建状态,此时仅仅有Java虚拟机为其分配了内存,并初始化成员变量的值。

2)当线程对象调用start()后,该线程处于就绪状态,Java虚拟机会为其创建方法调用栈和程序计数器,但并没有开始运行,何时运行取决于JVM里线程调度器的调度 

3)如果就绪状态的线程获得CPU,开始执行run方法的线程执行体,处于运行状态。如果计算机只有一个CPU,在任何时刻只有一条线程处于运行状态,在一个多处理器的机器上,将会有多个线程并行执行,当线程数大于处理器数时,依然会有多条线程在同一个CPU上轮换  

(调用yield()可以让当前处于运行状态的线程进入就绪状态)

4)下面几种情况,线程会进入阻塞状态:

(1)线程调用sleep方法主动放弃所占用的处理器资源

(2)线程调用了一个阻塞式IO方法,在该方法返回前该线程被阻塞

(3)线程试图获得一个同步监视器,但该同步监视器正被其他线程所持有

(4)线程在等待某个通知(notify)

(5)程序调用了线程的suspend方法将该线程挂起,此方法易导致死锁

5)下面情况线程会接触阻塞重新进入就绪状态:

(1)调用sleep方法的线程经过了指定时间

(2)线程调用的阻塞式IO方法已经返回

(3)成功获得同步监视器

(4)其他线程发出了等待的通知

(5)挂起的线程被调用了resume恢复方法

6)以下方式会处于死亡状态

(1)run()方法执行完成,线程正常结束

(2)线程抛出一个未捕获的Exception或Error

(3)直接调用该线程的stop()方法来结束该线程--易导致死锁,少用

 

不要对处于死亡状态的线程调用start()方法,程序只能对新建状态的线程调用start()方法,对新建状态的线程两次调用start()方法也是错误的

 

转载于:https://www.cnblogs.com/liutoutou/p/3328299.html

你可能感兴趣的文章
控制文件的备份与恢复
查看>>
返回代码hdu 2054 A==B?
查看>>
Flink独立集群1
查看>>
iOS 8 地图
查看>>
20165235 第八周课下补做
查看>>
[leetcode] 1. Two Sum
查看>>
iOS 日常工作之常用宏定义大全
查看>>
PHP的SQL注入技术实现以及预防措施
查看>>
MVC Razor
查看>>
软件目录结构规范
查看>>
Windbg调试Sql Server 进程
查看>>
linux调度器系列
查看>>
mysqladmin
查看>>
解决 No Entity Framework provider found for the ADO.NET provider
查看>>
SVN服务器搭建和使用(三)(转载)
查看>>
Android 自定义View (三) 圆环交替 等待效果
查看>>
设置虚拟机虚拟机中fedora上网配置-bridge连接方式(图解)
查看>>
HEVC播放器出炉,迅雷看看支持H.265
查看>>
[置顶] Android仿人人客户端(v5.7.1)——人人授权访问界面
查看>>
Eclipse 调试的时候Tomcat报错启动不了
查看>>