Java线程简介
来源:互联网 发布:puppet doll淘宝 编辑:程序博客网 时间:2024/06/08 06:52
一 线程的定义
线程,是程序执行流的最小单元,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。
一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。
二 线程的调度
进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。
机制:把时间划分为许多时间片然后轮流运行
如:计算机把1s以每5ms为一个时间片,每个线程运行5ms后把cpu交给下一个线程,让下一个线程运行。因为切换时间非常快感觉线程是在同时运行。
当运行Thread.sleep(1000),接下来的1000ms将放弃对cpu的使用权。
三 与进程的对比
进程是资源分配的基本单位。所有与该进程有关的资源,都被记录在进程控制块PCB中。以表示该进程拥有这些资源或正在使用它们。
四 线程的创建
(1)通过扩展Thread类来创建多线程
新建一个类extends Thread->重写run()->创建对象->调用start()
(2)通过实现Runnable接口来创建多线程
implements Runnable()->重写run()->创建对象
例:
public class MutliThreadDemo2 { public static void main(String [] args){ MutliThread m1=new MutliThread("Window 1"); MutliThread m2=new MutliThread("Window 2"); MutliThread m3=new MutliThread("Window 3"); Thread t1=new Thread(m1); Thread t2=new Thread(m2); Thread t3=new Thread(m3); t1.start(); t2.start(); t3.start(); }}class MutliThread implements Runnable{ private int ticket=100;//每个线程都拥有100张票 private String name; MutliThread(String name){ this.name=name; } public void run(){ while(ticket>0){ System.out.println(ticket--+" is saled by "+name); } }}(3) 匿名内部类:直接创建Thread类对象,然后重写run()
例
public class ThreadDemo01 { public static void main(String[] args) { /* * 第一种方式: * 1.继承Thread类 * 2.重写run方法 * 3.将要执行的代码写在run方法中 */ new Thread() { public void run() { for (int i = 0; i < 10; i++) { System.out.println("aaaaaaaaa"); } } }.start();//开启线程 }}
/* * 第二种方式: * 1.将Runnable的子类对象传递给Thread的构造方法 * 2.重写run方法 * 3.将执行的代码写在run方法中,最后我们开启线程 */ new Thread(new Runnable() { public void run() { for (int i = 0; i < 10; i++) { System.out.println("bbbbbbbbb"); } } }).start();//开启线程
五 线程的同步
详细了解:synchronized的四种用法
线程的同步是Java多线程编程的难点,需要考虑资源竞争、同步等。对于同步,在具体的Java代码中需要完成以下两个操作:把竞争访问的资源标识为private;同步哪些修改变量的代码,使用synchronized关键字同步方法或代码。当然这不是唯一控制并发安全的途径。synchronized关键字使用说明synchronized只能标记非抽象的方法,不能标识成员变量。显然银行账户User对象是个竞争资源,而多个并发操作的是账户方法oper(int x),当然应该在此方法上加上同步,并将账户的余额设为私有变量,禁止直接访问。
六 线程状态的变化
详细点击:线程的几种状态变化
(1)创建线程
当创建一个新的进程时,也创建一个新的线程,进程中的线程可以在同一进程中创建新的线程中创建新的线程。
(2)终止线程
可以正常终止自己,也可能某个线程执行错误,由其它线程强行终止。终止线程操作主要负责释放线程占有的寄存器和栈
(3)阻塞线程
当线程等待每个事件无法运行时,停止其运行。
(4)唤醒线程
当阻塞线程的事件发生,将被阻塞的线程状态置为就绪态,将其挂到就绪队列。进程仍然具有与执行相关的状态。例如,所谓进程处于“执行”状态,实际上是指该进程中的某线程正在执行。对进程施加的与进程状态有关的操作,也对其线程起作用。例如,把某个进程挂起时,该进程中的所有线程也都被挂起,激活也是同样。
- JAVA线程简介
- java线程池简介
- java线程池简介
- Java线程技术简介
- java 线程组简介
- java 线程池简介
- Java线程简介
- Java 线程简介
- java 线程简介
- java线程简介
- Java守护线程简介
- Java线程简介
- Java 线程简介
- java线程池简介
- Java 线程简介
- java线程简介(线程的生命)
- Java线程学习之线程简介
- Java线程学习笔记之线程简介
- 快速幂的实现
- 堆和栈的区别详解
- for_each学习,operator () 学习
- XMLHttpRequest对象三个属性,以及open,send方法
- STM32F429的外接nandflash当作U盘实现数据记录功能
- Java线程简介
- Zookeeper集群搭建的时遇到Connection refused
- 从文件 I/O 看 Linux 的虚拟文件系统
- XRecyclerView添加emptyview
- jsp页面间的传值方法,jsp 获取 url参数
- MyBatis的增删改查的基本操作:
- MySQL
- Siege压测使用和说明
- 进程、线程和协程的理解