线程引入
进程与线程对比
1.进程:进程是系统进行资源分配和调度的一个独立单位。比如在一台电脑上能同时运行多个QQ
2.线程:线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。比如一个QQ中的多个聊天窗口
3.线程与进程之间对比分析
①线程与进程之间的关系
4.进程和操作系统之间的关系
5.进程与线程之间的区别
①一个程序至少有一个进程,一个进程至少有一个线程
②线程的划分尺度小于进程(资源比进程少),使得多线程程序的并发性高
③进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率
④线程不能够独立执行,必须依存在进程中
Ps:可以将进程理解为工厂中的一条流水线,而其中的线程就是这个流水线上的工人
并发与并行
1.串行:所有任务都一一按照先后顺序进行;是一次只能取得一个任务,并执行这个任务
2.并行:指在同一时刻,有多条指令在多个处理器上同时执行,所以无论从微观还是从宏观来看,二者都是一起执行的
3.并发:指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行,如图所示:
异步和同步
1.同步:在发出一个功能调用时,在没有得到结果之前,该调用就不返回,也就是必须一件一件事做,等前一件做完了才能做下一件事
2.异步:当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者
线程创建方式
1.继承Tread类
2.实现Runnable接口
线程创建的步骤
继承Tread类步骤 ThreadDemo.java
①子类继承Thread
②重写run()方法,并且将线程的功能书写在run方法内部
③创建一个线程对象,并且调用start()启动线程
注意:start()是启动线程,run()是方法调用
package ThreadDemo;
public class ThreadAPIExample {
public static void main(String[] args) {
//1.创建线程
Thread1 t1 = new Thread1("线程1");//设置线程名字 = t1.setName("线程1");
//设置线程优先级
t1.setPriority(Thread.MAX_PRIORITY);
//获取线程优先级
System.out.println(t1.getPriority());
//2.启动线程
t1.start();
//3.获取当前线程名字
//String str = Thread.currentThread().getName();
//System.out.println(str);//main
//4.获取线程编号 返回值long型
long i = Thread.currentThread().getId();
System.out.println(i);
}
}
class Thread1 extends Thread{
public Thread1(){
}
public Thread1(String name){
super(name);
}
@Override
public void run(){
while(true){
//中断线程 运行中---->可运行
Thread.currentThread().interrupt();
//测试当前线程是否中断
boolean b1 = Thread.currentThread().isInterrupted();
//判断线程是否处于活动
boolean b = Thread.currentThread().isAlive();
//System.out.println(b);//true
//System.out.println(b1);//true
//System.out.println(Thread1.currentThread().getName()+"----t1----");
}
}
}
实现Runnable接口 RunnableDemo.java
①实现Runnable接口
②实现run()方法
③A创建线程
B创建线程资源
C产生实现Runnable()接口对象
D将产生线程资源对象
E作为thread类的参数,来产生线程对象
④启动线程
package ThreadDemo;
public class RunnableDemo {
public static void main(String[] args) {
//1.创建一个T2对象
T2 t2 = new T2();
//2.创建一个Thread对象
Thread th = new Thread(t2);
//3.启动线程
th.start();
//运行两个死循环
T2 t1 = new T2();
Thread th1 = new Thread(t1);
th1.start();
}
}
class T2 implements Runnable{
@Override
public void run() {
while(true){
System.out.println(Thread.currentThread().getName()+"-------");
}
}
}