多线程
一、线程与进程
进程:进程是一个程序执行的过程,其本质是系统对程序的资源分配和调度的独立单位。
线程:即程序中执行的线程。进程中可以有多个线程,且一个程序中所有的线程共享其进程的所有资源。
二、多线程
多线程的含义:即一个程序包含多个线程,且并发执行。
多线程的优先级:每个线程都有优先级,优先级较高的线程优于优先级较低的线程执行。
2.1 为什么要使用多线程:
1. 使用多线程的程序可以同时执行多个线程,满足用户同一时间的不同需求。
2. 提高CPU的利用率。
2.2 多线程的劣势:
当程序访问量过大,即线程数过多时:
1. 线程数会占用内存,对内存造成一定压力。
2. 由于线程数之间共享资源,线程与线程有可能会相互造成影响。
3. 线程过多导致的控制不易,同时易产生BUG。
2.3 主线程
主线程是指JAVA文件启动时立即启动一个线程调用的main方法。、
特殊点:
1. 产生其它子线程的线程。
2. 通常在最后关闭。
三、多线程的实现
多线程有两种主要的方法来实现,即继承Thread类与实现Runnable接口。
3.1 Thread类
3.1.1 构造函数
8种构造函数,其中常用构造函数2种:
Thread(String name);
Thread(Tunnable target,String name);
3.1.2 常用方法
start() | 让线程处于可允许状态 |
setPriorty(int newPriority) | 设置优先级(1-10),默认为5 |
Join() | 等待线程终止(抢占时间片) |
yield() | 线程礼让(静态方法),同优先级或更高 |
interrupt() | 终止线程 |
isAlive() | 是否处于活动状态 |
sleep(long millis) | 休眠(静态方法) |
sleep(long millis,int nanos) | 注:线程阻塞,系统在此期间不启用 |
3.1.3 继承Thread 类
//定义
public class TestThread extends Thread{
public void run(){
System.out.println("这是在继承了Thread类的Test类中的方法");
}
}
//调用
public static void main(String[] args) {
TestThread t = new TestThread ();
t.run();
}
3.2 Runnable接口
3.2.1 Runnable接口的实例由线程执行,且需要重写run方法。
3.2.2 run() :当实现接口的对象Runnable被用来创建一个线程,启动线程使对象的run在独立执行的线程中调用的方法。
3.2.3 继承runnable接口并实现多线程
//定义
public class TestThread implements Runnable{
public void run(){
System.out.println("这是在实现了Runnable接口的Test类中的方法");
}
}
//调用
public static void main(String[] args) {
TestThread t = new TestThread (); //创建对象
Thread th = new Thread(t); //创建Thread对象,并传入继承了接口的类TestThread的对象
th.start(); //开启线程
}
3.3 两种方法的区别
3.3.1 方法2有利于程序的扩展,避免了JAVA单继承的局限性。
3.3.2 共享资源时,方法1无法实现,方法2可以。
四、关键字synchronized()
同步锁,锁定一个方法或者执行语句,其只能同时由一个线程执行,此线程执行同步锁锁定的方法或者语句期间,其它线程无法执行此方法或者语句。