一、什么是多线程
进程可以简单的理解为一个可以独立运行的程序单位。它是线程的集合,进程就是有一个或多个线程构成的,每一个线程都是进程中的一条执行路径
多线程就可以理解为:一个进程中同时又多个执行路径(线程)正在执行
为什么要是用多线程?
1.在一个程序中,有很多的操作是非常耗时的,如数据库读写操作,IO操作等,如果使用单线程,那么程序就必须等待这些操作执行完成之后才能执行其他操作。使用多线程,可以在将耗时任务放在后台继续执行的同时,同时执行其他操作。
2.可以提高程序的效率。
3.在一些等待的任务上,如用户输入,文件读取等,多线程就非常有用了。
缺点:
1.使用太多线程,是很耗系统资源,因为线程需要开辟内存。更多线程需要更多内存。
2.影响系统性能,因为操作系统需要在线程之间来回切换。
3.需要考虑线程操作对程序的影响,如线程挂起,中止等操作对程序的影响。
4.线程使用不当会发生很多问题。
总结:多线程是异步的,但这不代表多线程真的是几个线程是在同时进行,实际上是系统不断地在各个线程之间来回的切换(因为系统切换的速度非常的快,所以给我们在同时运行的错觉)
二、线程的创建
线程创建的方法:
1. 创建一个Thread类,或者一个Thread子类的对象
Thread类是一个线程类,位于java.lang包下
构造方法
常用方法
2.创建一个实现Runnable接口的类的对象
只有一个方法run();
Runnable是Jave中用以实现线程的接口
任何实现线程功能的类都必须实现该接口
代码:通过继承Thread类的方式创建线程类,重写run()方法
package com.mpp.thread; //定义一个类继承Thread,实现run方法 class MyThread extends Thread{ public void run(){ System.out.println(getName()+"这个线程正在执行!"); } } public class ThreadTest { public static void main(String[] args) { // System.out.println("主线程1"); MyThread mt = new MyThread(); mt.start(); //启动线程(注意:1.一个线程只能执行一次;2.启动线程用stat,执行run中的代码,而不是调用run方法) // System.out.println("主线程2"); // mt.start(); 编译ok执行异常 } }
代码二:通过实现Runnable接口的方式创建线程
为什么要实现Runnable接口?
--Java不支持多继承
--不打算重写Thread类的其他方法
package com.mpp.runnable; class PrintRunnable implements Runnable{ int i= 1; //t1h和t2一共执行10次 @Override public void run() { // int i = 1; //t1和t2一共执行20次,各执行10次 while (i<10) System.out.println(Thread.currentThread().getName()+"正在运行"+i++); } } public class Test { public static void main(String[] args) { PrintRunnable pr = new PrintRunnable();//创建PrintRunnable对象 Thread t1 = new Thread(pr); //创建Thread对象,并把pr传入 t1.start();//启动线程 // PrintRunnable pr1 = new PrintRunnable();//创建PrintRunnable对象 Thread t2 = new Thread(pr); //创建Thread对象,并把pr传入 t2.start();//启动线程 } }
三、线程的状态和生命周期
1. 线程的状态
-新建(New)
-可运行(Runnable)
-正在运行(Running)
-阻塞(Blocked)
-终止(Dead)
2. 线程的生命周期
(1)sleep方法的使用
package com.mpp.runnable; class MyThread implements Runnable{ @Override public void run() { for(int i=0;i<30;i++){ System.out.println(Thread.currentThread().getName()+"执行第"+i+"次!"); try{ Thread.sleep(1000); } catch (InterruptedException e){ e.printStackTrace(); } } } } public class SleepDemo { public static void main(String[] args) { MyThread mt = new MyThread(); Thread t = new Thread(mt); t.start(); Thread t1 = new Thread(mt); t1.start(); } }
四、线程调度
五、同步与死锁