JAVA多线程
Posted 卡尼慕
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA多线程相关的知识,希望对你有一定的参考价值。
线程与进程
进程
如图,引用中有7个进程。随便打开一个进程,如安全管家。
这里的红框内就包含了病毒查杀,首页体检,垃圾清理和电脑加速这几个线程。
进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。
线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。
一个程序运行后至少有一个进程,一个进程中可以包含多个线程。
单线程与多线程
单线程程序:要等待上一个线程完成才能进行下一个线程,也就是依次进行。
多线程程序:多个任务可以同时进行,如百度云网盘可以多个任务同时下载。
主线程
当我们启动JVM虚拟机,加载.class文件时,虚拟机会从main方法开始执行代码。当main中有一个很大的循环时,在这个循环没执行完全之前,下面的代码是不会运行的。
即,JVM启动后,必然有一个执行路径(线程)从main方法开始的,一直执行到main方法结束,这个线程在java中称之为主线程。
创建线程的两种方式
A、继承Thread类
创建线程的步骤:
1 定义一个类继承Thread。
2 重写run方法。
3 创建子类对象,就是创建线程对象。
4 调用start方法,开启线程并让线程执行,同时还会告诉jvm去调用run方法
如果需要获取线程名称,可以通过下面两个方法。
Thread.currentThread()获取当前线程对象
Thread.currentThread().getName();获取当前线程对象的名称
上图来自博客,讲述了多线程中的内存图解。
B、实现Runnable接口
创建线程的步骤。
1、定义类实现Runnable接口。
2、覆盖接口中的run方法。。
3、创建Thread类的对象
4、将Runnable接口的子类对象作为参数传递给Thread类的构造函数。
5、调用Thread类的start方法开启线程。
线程池
是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。
使用线程池方式--Runnable接口
Executors:线程池创建工厂类
ExecutorService:线程池类
Future接口:用来记录线程任务执行完毕后产生的结果。线程池创建与使用
l使用线程池中线程对象的步骤:
1、创建线程池对象
2、创建Runnable接口子类对象
3、提交Runnable接口子类对象
4、关闭线程池
1public class ThreadPoolDemo {
2 public static void main(String[] args) {
3 //创建线程池对象
4 ExecutorService service = Executors.newFixedThreadPool(2);//包含2个线程对象
5 //创建Runnable实例对象
6 MyRunnable r = new MyRunnable();
7
8 //自己创建线程对象的方式
9 //Thread t = new Thread(r);
10 //t.start(); ---> 调用MyRunnable中的run()
11
12 //从线程池中获取线程对象,然后调用MyRunnable中的run()
13 service.submit(r);
14 //再获取个线程对象,调用MyRunnable中的run()
15 service.submit(r);
16 service.submit(r);
17//注意:submit方法调用结束后,程序并不终止,是因为线程池控制了线程的关闭。将使用完的线程又归还到了线程池中
18
19//关闭线程池
20 //service.shutdown();
21 }
22}
23
24public class MyRunnable implements Runnable {
25 @Override
26 public void run() {
27 System.out.println("我要一个教练");
28
29 try {
30 Thread.sleep(2000);
31 } catch (InterruptedException e) {
32 e.printStackTrace();
33 }
34 System.out.println("教练来了: " +Thread.currentThread().getName());
35 System.out.println("教我游泳,交完后,教练回到了游泳池");
36 }
37}
使用线程池方式—Callable接口
Callable接口:与Runnable接口功能相似,用来指定线程的任务。其中的call()方法,用来返回线程任务执行完毕后的结果,call方法可抛出异常。
ExecutorService:线程池类
Future接口:用来记录线程任务执行完毕后产生的结果。
线程池创建与使用。
1、使用线程池中线程对象的步骤:
2、创建线程池对象
3、创建Callable接口子类对象
4、提交Callable接口子类对象
5、关闭线程池
向左滑动
好好学习
天天向上
以上是关于JAVA多线程的主要内容,如果未能解决你的问题,请参考以下文章