程序:为完成特定的任务,用某种语言编写的一组指令的集合,即一段静态的代码
进程:正在运行的一个程序
线程:一个程序内部的一条执行路径
进程可以细化为多个线程
每个线程都拥有自己独立的:栈和程序计数器
多个线程共享同一个进程的结构:方法区和堆
一个进程中的多个线程共享一份方法区和堆
每个线程都有独立的程序计数器和虚拟机栈
并行:多个cpu同时执行多个任务
并发:一个CPU同时执行多个任务
方法一:使用Thread
①:创建类来继承Thread
②:重写Thread类中的run()方法—>此线程执行的方法放在run()方法中
③:创建子类对象
④:子类调用start()方法,start()作用:调用此线程;执行此线程的run()方法
创建多线程的方式二:实现Runnable接口
- 1.创建实现了Runnable接口的类
- 2.实现Runnable中的唯一一个抽象方法:run()
- 3.创建实现类的对象
- 4.将实现类的的对象放到Thread类的构造器中,创建Thread类对象
- 5.通过Thread类的对象调用strat()方法
1.start():启用当前线程;调用当前线程的run()方法
2.run():通常需要重写Thread中的run()方法,将创建的线程要执行的
操作申明在此方法中
3.currentThread():静态方法,返回执行当前代码的线程
4.getName():获取当前线程的名称
5.setName():设置当前线程的名称
6.yield():释放当前CPU的执行权
7.join():在线程A中调用线程B的join(),此时线程A就进入阻塞状态,直到线程B都执行完
线程A才结束阻塞状态。
8.stop():已过时,当执行此方法时,强制结束当前线程。
9.sleep(long millitime):让当前线程睡眠指定的millitime毫秒,在这个睡眠时间里线程是阻塞状态
10:isAlive():判断当前线程是否存活
一:
MAX_PRIORITY: 10
MIN_PRIORITY: 1
NORM_PRIORITY: 5 ----->默认优先级
二:如何获取和设置当前的优先级
getPriority():获取
setPriority():设置
高优先级的线程抢占低优先级的CPU执行权,只是从概率上讲,高优先级的线程 高概率的情况下被执行,并不意味着高优先级线程全执行完执行低优先级
*/
public class MyThread extends Thread{ @Override //2.重写Thread类中的run()方法--->将此线程执行的操作放在run()中 public void run() { super.run(); for(int i = 0 ; i < 100 ; i++){ if(i % 2 == 0){ System.out.println(Thread.currentThread().getName()+"t"+ i); } } } } class ThreadTest { public static void main(String[] args) { //3.创建Thread子类对象 MyThread t1 = new MyThread(); // 4.通过此对象调用start() //start()作用:①:启用当前线程。②:调用当前线程的run()方法 t1.start(); //问题一:我们能不能直接调用run()方法启动线程 // t1.run(); //问题二:再去启动一个线程,不可继续start(),会报IllegalThreadStateException错误 //t1.start(); // 必须重新创建一个线程对象 MyThread t2 = new MyThread(); t2.start(); for (int i = 0; i < 100; i++) { if (i % 2 == 0) { System.out.println(Thread.currentThread().getName()+ i + "*****main****"); } } } }比较线程的两种创建方式:
-
开发中:优先选择 Runnable接口的方式
-
原因:
1.实现的方式没有类的单继承的局限性
2.实现的方式更适合来处理多个线程有共享数据的情况 -
联系:public class Thread implements Runnable
-
相同点:两种方式都重写run(),将线程的执行写在run()中,目前两种方式,要想启动线程,都是调用的Thread类中的start()
线程通信:wait(),notify(),notifyAll():此三个方法定义在Object类中。
补充:线程的分类:一种是守护线程,一种是用户线程。