======多线程======
题引:多进程,多任务,多线程----操作系统资源。 与Java本身没有关联,Java没有能力创建这些 资源。宏观上的调控,达不到微观。
在操作系统中打开一个软件,就开了一个多进程。 并不是说一个软件就肯定只打开一个进程,可能是 多个进程---依赖关系---守护进程。
一个进程可以完成多个任务。。。
多任务,就是通过多线程实现。。。
多线程有产生了进程之间的并发。。。
并发:多个进程公用一个资源----临界资源。
注意点:在同一个时间点,只有一个线程走。 启动了一个程序,jvm会首先创建这个main的线程,
主线程。
当进程被创建的时候,操作系统--cpu为其分配资源,
内存资源----所有的程序运行,必须运行在内存中。
软件1----进程1-----10M---任务1---1/1001
时间片段:1/1001
一个进程有10个线程--1/10000
争夺资源的时候,能不能争夺到,争夺多少。。CPU定。
===================================
1.什么线程?
操作系统 一个 概念。
运行中的程序--线程----内存资源,计数器,寄存器。。。
通过小案例:直观感受线程---线程改变了程序的运行顺序。
cpu 执行 分配 时间片 的 最小单位。
多进程,多线程出现的原因:充分利用cpu资源。
1、什么是进程?
就是一个独立的运行空间,
生命周期:
新的:创建新的进程
运行:运行
等待:由于外部条件不足,导致等待
就绪:是进程可以处于可运行状态。
死亡:进程结束,异常结束。
2.线程 进程 区别?
一个运行着的 app 操作系统就会为之开辟一个进程,开销管理。
一个进程 至少包含一个线程。
3.基于线程的多任务和基于进程的多任务区别?
数据通信 前者 开销小
后者 开销大
4.如何实现多线程
步骤1:
实现 Runnable接口 run 方法
继承 Thread 类---本身实现了Runnable接口
步骤2:启动线程
必须使用 Thread 对象 的start();
5. 感受多线程:
run叫做 线程方法
start 本地方法
Thread 创建 启动线程
Runnable 创建 启动 (需要new Thread(Runnable).start())
3、多线程的实现方式
第一种:继承Thread,重写run
run方法称之为线程方法。
start启动线程:是一个本地方法,这个等于通知os.
我这个线程可以运行了,最终运不运行,走不走,
是么时候走,走多久,都是由os控制。
Java对于线程只能宏观控制。
注意点:线程是cpu调度资源的最小单位。
第二种:实现Runnable接口,
5、线程的生命周期?
1、创建:创建了一个线程 -----new Thread(Runnable)
2、就绪:线程调用了start方法,可运行的状态 -----start
3、 运行:线程了获得了cpu的使用权。 -----run
4、 阻塞:由于某种原因,线程暂时放弃了cpu的使用权, -----io sleep wait ....知道该线程重新处于就绪状态。
等待阻塞:程序执行了wait方法,进入等待池。
对象方法,不是线程方法。
同步阻塞:sleep,让线程休眠。
不让当前线程独占cpu资源。
其他阻塞:join,线程加入。yield线程让步。
5、 消亡:线程运行结束,出现了异常,跳出run方法。 -----run执行完成
6、线程调度?
宏观控制,而不能围观控制
第一种:线程的优先级别:1-10
t1.setProperty(int);
使用的是三个默认级别:
t1.setPriority(Thread.MAX_PRIORITY);
t2.setPriority(Thread.MIN_PRIORITY);
t2.setPriority(Thread.NORM_PRIORITY);
第二种调度方式:线程休眠
第三种调度方式:线程等待
第四种调度方式:线程join
第五种调度方式:线程让步--yield
7、线程同步?
目的:就是为了解决数据的并发异常。
多各线程操作同一份数据,导致的数据不一致。
弟弟和妹妹共用一个柜子:柜子:临界资源。
超市的柜子:谁拿到了这个小票,谁就使用这个对子。
小票:对象监视器
线程同步研究的就是:线程和对象监视器之间的关系。
每一个对象本身都有一个唯一的对象监视器。
厕所案例:厕所的坑是不是资源?
、
/**
*案例:打电话
*/
public class D01 extends Thread{
public void run(){
for (int i = 0; i <1000; i++) {
System.out.println("-----"+i);
}
}
}
public class D02 extends Thread{
public void run(){
for (int i = 0; i <1000; i++) {
System.out.println("======"+i);
}
}
}
public class RunTest implement Runnable{
for (int i = 0; i <1000; i++) {
System.out.println("*******"+i);
}
}
}
public class Text {
/**
* @param args
*/
public static void main(String[] args) {
D01 d01 = new D01();
D02 d02 = new D02();
RunTest r1 = new RunTest();
Thread d3 = new Thread(r1);
//线程调度
//d01.setPriority(Thread.MIN_PRIORTY);
//d02.setPriority(Thread.MIN_PRIORTY);
// d03.setPriority(Thread.MAX_PRIORTY);
d02.start();
try{
d1.join(); //join:让当前线程跟在指定线程之后
}catch(){
e.printStackTrace();
}
d03.start();
}
}