⭐区分进程线程
进程(Process):
操作系统资源分配的最小单位
多进程:都去银行汇款,如果甲和乙用的不是同一张银行卡,其实根本办的不是一件事
线程 (Thread):
操作系统调度的最小单位(操作系统CPU资源分配的最小单位)
多线程:都去银行汇款,如果甲和乙用的是同一张银行卡,其实办的就是同一件事
1.为什么需要多线程模型处理?优点
有些场合 可能提升速度;(增加线程极限、本身创建线程+销毁线程 也需要耗费时间)
有些场合 必须使用多线程;(阻塞式IO,一个调度单位倒下,剩下调度单位还能抢CPU工作)
线程可能被从CPU上调度下来的5种情况?
1.高优先级抢走
2.执行结束
3.在等IO
4.主动放弃
5.时间片耗尽
2.多线程谁先谁后?
优先级只是建议,不是强制!!!
t.join( ); 主线程阻塞,直到t线程执行结束,猜接着往下执行
输出结果:大概率是 main–>a–>b ,其他情况都有可能!!!!!!!!!!
大概率CPU最先分配给主线程main,主线程结束在分配给其他线程
public class 线程执行顺序与主线程对比 {
private static class A extends Thread{
@Override
public void run(){
System.out.println("我是A");
}
}
private static class B extends Thread{
@Override
public void run(){
System.out.println("我是B");
}
}
public static void main(String[] args) {
A a=new A();
B b=new B();
//a、b 放入就绪队列中
a.start();
b.start();
System.out.println("我是main");
}
}
3.如何创建线程对象 ??? (后续.start()加入就绪队列)
直接创建线程对象;
先创建任务对象,再创建线程对象。
Thread类代表线程,Runnable类代表任务。
private static class MyThread extends Thread{
@Override
public void run(){
//希望线程执行的代码
}
}
Thread t=new MyThread(); //创建线程对象
-------------------------------------------------------------------
private static class MyRunnable implements Runnable{
@Override
public void run(){
//希望线程执行的代码
}
}
Runnable target=new MyRunnable(); //创建target目标对象 任务
Thread t1=new Thread(traget); //创建线程去运行同一份目标对象
Thread t2=new Thread(traget);
Thread t3=new Thread(traget);