多线程
多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念。 进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。 什么是多线程呢?即就是一个程序中有多个线程在同时执行。 通过下图来区别单线程程序与多线程程序的不同: 单线程程序:即,若有多个任务只能依次执行。当上一个任务执行结束后,下一个任务开始执行。如,去网吧上网,网吧只能让一个人上网,当这个人下机后,下一个人才能上网。 多线程程序:即,若有多个任务可以同时执行。如,去网吧上网,网吧能够让多个人同时上网。 例子: public class Demo01 { //主线程 :程序从上往下执行的过程 //javac编译Demo01 //JVM 运行你的Demo01的main方法 找操作系统OS 开启线程 //对于CPU来说就是有一条执行路径 运行方法main的这条路径有个名字叫"main"即主线程 public static void main(String[] args) { System.out.println(0/0); method1(); } public static void method1(){ for(int i=0;i<1000;i++){ System.out.println(i); } } }
程序运行原理
分时调度
所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
抢占式调度
优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。
创建新执行线程有两种方法。
一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。创建对象,开启线程。run方法相当于其他线程的main方法。
另一种方法是声明一个实现 Runnable 接口的类。该类然后实现 run 方法。然后创建Runnable的子类对象,传入到某个线程的构造方法中,开启线程。
方式一:Thread类
构造方法
常用方法
public class ThreadDemo extends Thread{ public ThreadDemo(){} public ThreadDemo(String name){ super(name); } public void run() { //System.out.println(getName());//获取线程名字 for(int i=0;i<100;i++){ try { sleep(1000);//休眠 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(i); } } } public class Test { //开线程的第一种方法 //1.定义Thread子类,继承Thread 重写run方法 //2.在测试类中,创建Thread子对象 //3.用子类对象调用start方法 只能调用一次 public static void main(String[] args) { //创建线程对象 ThreadDemo td=new ThreadDemo(); //开启线程 start:1.让线程执行 2.让JVM调用线程中的run方法 td.start(); /*for(int i=0;i<100;i++){ System.out.println(i+"主"); }*/ //获取主线程名字 Thread td2=Thread.currentThread(); System.out.println(td2.getName());//main } } public class Test1 { public static void main(String[] args) { ThreadDemo td=new ThreadDemo("小野爹"); //设置线程名称 td.setName("小野猪"); //开启线程 td.start(); } } public class Test2 { //休眠一秒执行 public static void main(String[] args) { ThreadDemo td=new ThreadDemo(); td.start(); } } 方式二:实现Runnable接口
接口中的方法
Thread类构造方法
public class MyRunable implements Runnable{ public void run(){ for(int i=0;i<100;i++){ System.out.println(Thread.currentThread().getName()+" "+i); } } } public class Test { //第二种创建线程的方式 //1.创建实现类,实习Runnable接口,重写run方法 //2.在测试类中创建实现类对象,创建线程对象,将实现类对象传入线程对象的构造方法 //3.用线程对象开启线程 //高内聚,低耦合 public static void main(String[] args) { //创建线程任务对象 MyRunable mr=new MyRunable(); //创建线程对象 Thread t1=new Thread(mr); //开启线程 t1.start(); Thread t2=new Thread(mr); t2.start(); } }
线程的匿名内部类使用 public class Demo01 { //匿名内部类 //new 抽象类接口(){ //重写父类方法 //}.子类独有的方法 public static void main(String[] args) { //多态定义一个runnable实现类对象 //来描述线程任务 Runnable r=new Runnable(){ public void run() { System.out.println("1"); } }; //创建线程 Thread t=new Thread(r); //开启线程 t.start(); //也可以一句话实现 new Thread(new Runnable(){ public void run() { System.out.println("2"); } }).start(); } }