java多线程基础
进程与线程概念
进程:指一个内存中运行的应用程序,每一个进程都有一个独立空间。
线程:一个进程可以开辟多个执行路径,共享一个内存空间,一个执行路径是一个线程,线程之间可以自由切换,并发(两个或者多个时间在同一时间段内发生,区别于并行(同时发生))执行。一个进程最少有一个线程。
调度分类
分时调度:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间。
抢占式调度:优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性)java默认使用抢占式调度
线程分类
用户线程:当一个进程不包含任何的存活的用户线程是进程结束。
守护线程:守护用户线程的,当最后一个用户线程结束时,所有守护线程自动死亡。
守护线程的创建:任务对象.setDaemon(true);
线程的创建
线程创建有 三种方式(继承Thread、实现Runnable接口、实现Callable接口 )
一、Thread
将类声明为Thread的子类。 此子类应覆盖类Thread的run方法。 然后可以分配和启动子类的实例。
//线程的创建
class PrimeThread extends Thread {
long minPrime;
PrimeThread(long minPrime) {
this.minPrime = minPrime;
}
public void run() {
// compute primes larger than minPrime
. . .
}
}
//线程启动
public class Test {
public static void main(String[] args) {
PrimeThread p = new PrimeThread(143);
p.start();
}
}
二、Runnable
声明一个实现Runnable接口的类。 该类然后实现run方法。 然后可以分配类的实例,在创建Thread时作为参数传递,然后启动。
class PrimeRun implements Runnable {
long minPrime;
PrimeRun(long minPrime) {
this.minPrime = minPrime;
}
public void run() {
// compute primes larger than minPrime
. . .
}
}
//线程启动
public class Test {
public static void main(String[] args) {
PrimeRun p = new PrimeRun(143);
new Thread(p).start();
}
}
实现Runnable接口与继承Thread区别
1.通过创建任务,然后给线程分配的方式实现多线程,更适合多个线程同时执行相同的任务。
2.可以避免继承所 带来的局限性
3.任务与线程分离提高了程序的健壮性。
4.线程池大多数接收Runnable类型任务,不接受Thread类型任务。
三、Callable(使用较少,作为了解知识)
Callable接口会生成带返回值的线程,类似于Runnable ,因为它们都是为其实例可能由另一个线程执行的类而设计的。 但是, Runnable不会返回结果,也不能抛出已检查的异常。
线程的六种状态
1.New 创建未启动线程
2.Runnable 在java虚拟机中执行的线程状态
3.Blocked 被阻塞排队等待
4.Waiting 无限期等待直到被唤醒
5.Time_waiting 指定时间等待,到时间自动唤醒
6.Terminated 退出线程
线程常用方法
变量和类型 | 方法 | 描述 |
---|---|---|
static void | sleep(long millis) | 导致当前正在执行的线程休眠(暂时停止执行)指定的毫秒数,具体取决于系统计时器和调度程序的精度和准确性。 |
String | getName() | 返回此线程的名称。 |
void | interrupt() | 中断此线程。 |
void | setDaemon(boolean on) | 将此线程标记为 daemon线程或用户线程。 |
void | run() | 如果此线程是使用单独的Runnable运行对象构造的,则调用该Runnable对象的run方法; 否则,此方法不执行任何操作并返回。 |
void | start() | 导致此线程开始执行; Java虚拟机调用此线程的run方法。 |
static Thread | currentThread() | 返回对当前正在执行的线程对象的引用。 |
int | getPriority() | 返回此线程的优先级。 |