java中的多线程是一个同时执行多个线程的进程,线程是一个轻量级的子进程,是最小的处理单位。线程是进程的一条执行路径,
而进程是线程的集合。
1.优点:
① 他不会阻塞用户,因为线程是独立的,可以同时执行多个操作。
② 可以一起执行许多操作,因此可以节省时间。(提高程序效率)
③ 线程是独立的,因此如果单个线程中发生异常,他不会影响其他线程。
2.多任务处理
多任务处理是同时执行多个任务的过程。使用多任务来利用CPU,多任务处理可以通过两种方式来实现:
① 基于进程的多任务处理(多进程)
特点:每个进程在内存中都单独分配有一个内存区域,进程是重量级的。进程之间的通信成本很高。从
一个进程切换到另一个进程需要一些时间来保存和加载寄存器、内存映射、更新列表等。
② 基于线程的多任务处理 (多线程)
特点:线程共享相同的地址空间;线程之间是轻量级的;线程之间的通信成本很低。
3.Thread类
java提供了Thread类来实现线程编程。Thread类提供了在线程上创建和执行操作的构造函数和方法。Thread类
扩展了object类并实现了runnable接口。
创建线程的方式: MyThread myThread = new MyThread();
4.runnable接口
创建线程有两种方式,一种是直接继承Thread类,另外一种是实现runnable接口。相比较Thread而言,通过实现
runnable的方式可以更容易地实现资源共享,并且接口可以多实现且还能再继承其他类。
总结:① 适合多个相同的程序代码的线程去处理同一个资源
② 可以java中单继承的限制
③ 增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。
创建线程的方式: MyThread myThread = new MyThread(); //只需要创建一个实例化对象然后被多个线程使用
Thread Thread1 = new Thread(myThread); //线程1
Thread Thread2 = new Thread(myThread); //线程2
5.线程生命周期
① 新建状态:通过new创建一个线程,跟其他对象的创建时一样的。此时虚拟机会为其分配内存,并初始化
其成员变量的值。
② 就绪状态:当线程对象调用了start方法之后,线程就进入了就绪状态。程序就会为其创建方法调用栈和程
序计数器,处于这个状态中的线程并没有开始运行,只是表示该线程可以运行了,至于何时运
行,取决于jvm中的线程调度器的调度。
③ 运行状态:当处于就绪状态的线程获得cpu,开始执行run()方法的线程执行体时,线程就进入了运行状态,
线程调度的细节取决于底层平台采用的策略(抢占式调度策略和协作式调度策略)
④ 阻塞状态:运行状态的线程遇到以下情况就会进入阻塞状态:
1.线程自己调用sleep方法主动放弃处理器资源;
2.该线程调用了一个阻塞式IO方法,在该方法返回之前,该线程处于阻塞状态。
3.该线程试图获得一个同步监视器,但该同步监视器正被其他线程持有。
4.线程正在等待某个通知(notify)
5.程序调用了线程的suspend方法,将线程挂起(容易导致死锁,避免使用)
⑤ 死亡状态:有三种情况会使线程进入死亡状态:
1.run方法执行完成,线程正常结束。
2.线程抛出未被捕获的exception或者error
3.人为停止,比如调用stop方法(暴力停止,不建议使用),以及其他停止策略。
6.线程中常用的方法
package com.multithreading.test;
//创建线程类,方法一
public class MyThread extends Thread {
public MyThread() {
}
public MyThread(String threadName,ThreadGroup tg) {
super(tg,threadName);
start();
}
//线程功能函数
public void run() {
for(int i=1;i<=5;i++) {
try {
Thread.sleep(500);
} catch (Exception e) {
System.out.println(e.toString());
}
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
public static void main(String[] args) throws InterruptedException {
//创建线程的方式1
MyThread myThread = new MyThread();
myThread.start();
myThread.interruptAndIsInterruptedA