java多线程汇总_Java多线程编程基础知识汇总

多线程简介

多任务

现代操作系统(Windows、Linux、MacOS)都可以执行多任务,多任务就是同时运行多个任务。例如在我们的计算机上,一般都同时跑着多个程序,例如浏览器,视频播放器,音乐播放器,Word办公软件等等,由于CPU执行代码都是一条一条顺序执行的,即时是单核CPU也可以同时执行多个任务,操作系统执行多个任务实际上就是轮流让多个任务交替执行。即使是多核CPU,因为通常任务的数量是远多于CPU的核数,所以任务也是交替执行的。

进程(Process)

在计算机中,我们把一个任务称为一个进程。浏览器就是一个进程,视频播放器是另外一个进程,音乐播放器也是一个进程,在某些进程内部还需要同时执行多个子任务。例如我们在使用Word时,在打字的同时需要进行拼写检查,还可以在后台进行打印,我们把子任务称为线程。

进程和线程的关系:

一个进程可以包含一个或多个线程(至少包含一个线程)

线程是操作系统调度的最小任务单位

如何调度线程完全由操作系统决定(程序自己不能决定线程何时执行,执行多长时间)

实现多任务的三种方法:

多进程模式(每个进程只有一个线程)

多线程模式(一个进程有多个线程)

多进程+多线程(复杂度最高)

多进程和多线程的对比:

创建进程比创建线程开销大(尤其是在Windows系统上)

进程间通信比线程间通信慢

多进程稳定性比多线程高(因为在多进程的情况下,一个进程的崩溃不会影响其他进程,而在多线程的情况下,任何一个线程的崩溃,会直接导致整个进程崩溃)

Java语言内置多线程支持,一个Java程序实际上是一个JVM进程,JVM进程用一个主线程来执行main()方法,在main()方法中又可以启动多个线程,此外,JVM还有负责垃圾回收的其他工作线程等。和单线程相比,多线程编程的特点在于:多线程经常需要读写共享数据,并且需要同步。例如,播放电影时,就必须由一个线程播放视频,另一个线程播放音频,两个线程需要协调运行,否则画面和声音就不同步。因此,多线程编程的复杂度高,调试更困难。

Java多线程基础

创建一个线程对象,并启动一个新的线程。创建线程对象的方法有两种:第一种就是创建MyThread类,去继承Thread类,覆写run()方法,创建MyThread实例,调用start()启动线程。第二种:如果一个类已经从某个类派生,无法从Thread继承,就可以通过实现Runnable接口,重写run()方法,在main()方法中创建Runnable实例,创建Thread实例并传入Runnable,调用start()启动线程。注意:必须调用Thread实例的start()方法才能启动新线程,如果我们查看Thread类的源代码,会看到start()方法内部调用了一个private native void start0()方法,native修饰符表示这个方法是由JVM虚拟机内部的C代码实现的,不是由Java代码实现的。

总结:Java用Thread对象表示一个线程,通过调用start()启动一个新线程,一个线程对象只能调用一次start()方法;线程的执行代码写在run()方法中,一旦run()方法执行完毕,线程就结束了;线程调度由操作系统决定,程序本身无法决定调度顺序。

线程的状态:

New:新创建的线程,尚未执行;

Runnable:运行中的线程,正在执行run()方法的Java代码;

Blocked:运行中的线程,因为某些操作被阻塞而挂起;

Waiting:运行中的线程,因为某些操作在等待中;

Timed Waiting:运行中的线程,因为执行sleep()方法正在计时等待;

Terminated:线程已终止,因为run()方法执行完毕。

152b10c91db452a701546ab26b1c4e4c.png

线程终止的原因:

run()方法执行到return语句返回(线程正常终止)

run()方法因为未捕获的异常导致线程终止(线程意外终止)

对某个线程的Thread实例调用stop()方法强制终止(强烈不推荐使用)

通过对另一个线程对象调用join()方法可以等待其执行结束,可以指定等待时间,超过等待时间线程仍然没有结束就不再等待;对已经运行结束的线程调用join()方法会立刻返回。

中断线程:如果线程需要执行一个长时间任务,就可能需要能中断线程。中断线程就是其他线程给该线程发送一个信息,该线程收到信号后,结束执行run()方法。例如我们从网络下载一个100M的文件,如果网速很慢,我们等得不耐烦,就可能在下载过程中点“取消”,这时,程序就需要中断下载线程的执行。中断线程需要通过检测isInterrupted标志,其他线程需要通过调用interrupt()方法中断该线程。如果线程处于等待状态,该线程会捕获InterruptedException。捕获到InterruptedException说明有其他对其线程调用了interrupt()方法,通常情况下该线程应该立刻结束运行。

public class Main {

public static void main(String[] args) throws InterruptedException {

Thread t = new MyThread();

t.start();

Thread.sleep(1000);

t.interrupt(); // 中断t线程

t.join(); // 等待t线程结束

System.out.println("end");

}

}

class MyThread extends Thread {

public void run() {

Thread hello = new HelloThread();

hello.start(); // 启动hello线程

try {

hello.join(); // 等待hello线程结束

} catch (InterruptedException e) {

System.out.println("interrupted!");

}

hello.interrupt();

}

}

class HelloThread extends Thread {

public void run() {

int n = 0;

while (!isInterrupted()) {

n++;

System.out.println(n + " hello!");

try {

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值