基本概念
进程是一次任务的执行,是一个程序及其数据在处理机上顺序执行时所发生的活动,通俗点windows系统的每个运行的exe就是个进程,一个进程有多个线程组成
线程可以理解成是进程中独立运行的子任务。
为什么使用多线程
上面说线程是进程中独立运行的子任务,单线程时,也就是单任务的时候,每个任务是顺序执行的,同步的。比如有两个任务a和b,a任务是等待下载文件,时间是5s,CPU处于等待状态,b任务只需要1s,即使b任务是短短1s,也需要a的5s执行结束才能执行b。
多线程时,CPU可以在任务a和任务b之间切换,使任务b并不需要等a执行完再执行,提高了系统运行效率,这就是多线程的优点,也就是异步。
线程创建的方式
方式一:继承Thread,缺点是java只支持单继承,其实看源码Thread类也是实现了Runnable接口
方式二(建议):实现Runnable接口,一般使用这种方式(当类本身已经继承某类,则可使用实现接口这种方式)
继承Thread方式
public class MyThread2 extends Thread{ @Override public void run(){ try { for(int i=0;i<10;i++){ int time = (int) (Math.random() * 1000); Thread.sleep(time); System.out.println("run="+ Thread.currentThread().getName()); } } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) { MyThread2 myThread2 = new MyThread2(); myThread2.start();//启动线程 try { for (int i=0;i<10;i++){ int time = (int) (Math.random() *1000); Thread.sleep(time); System.out.println("main="+Thread.currentThread().getName()); } } catch (InterruptedException e) { e.printStackTrace(); } } }
运行结果
run=Thread-0 main=main run=Thread-0 main=main run=Thread-0 run=Thread-0 main=main run=Thread-0 main=main run=Thread-0 main=main run=Thread-0 main=main main=main main=main run=Thread-0 run=Thread-0 main=main main=main run=Thread-0
从运行结果看出来:代码运行结果和代码执行顺序无关,上面代码具有异步效果
Thread.start()方法才是启动一个线程,如果直接执行run(),其实相当于java中顺序执行一个方法
实现Runnable方式
public class MyRunnable implements Runnable { public void run() { System.out.println(Thread.currentThread().getName()); } public static void main(String[] args) { MyRunnable runnable = new MyRunnable(); Thread thread = new Thread(runnable); thread.start(); System.out.println("end!!"); } }
运行结果
end!! Thread-0
线程实现只有这两种,但是表现形式多种
例1:
public static void main(String[] args) { Thread thread = new Thread(new Runnable() { public void run() { System.out.println(Thread.currentThread().getName()); } }); thread.start(); System.out.println("end!!"); }
例2:
public static void main(String[] args) { Runnable runnable = new Runnable() { public void run() { System.out.println(Thread.currentThread().getName()); } }; Thread thread = new Thread(runnable); thread.start(); System.out.println("end!!"); }